由于開發中用到金額輸入,需要對 textField 輸入框做限制,保證輸入金額格式的合法性,現對限制規則做以下總結。
具體實現的限制
- 金額只能包含數字 0 ~ 9 和 小數點;
- 首位不能是小數點;
- 小數點只能存在一個;
- 首位為 0 時,第二位必須是小數點;
- 小數點后面最多兩位。
- 這里主要使用了 textField 的以下代理方法
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
- 下面是具體代碼,內含詳細注釋
// textField輸入金額的限制
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
//金額的最大長度,自行調節
if (textField.text.length > 10) {
return range.location < 11;
}else{
//記錄是否有小數點
BOOL isHaveDian = YES;
if ([textField.text rangeOfString:@"."].location == NSNotFound) {
isHaveDian=NO;
}
if ([string length] > 0) {
unichar single = [string characterAtIndex:0];//當前輸入的字符
if ((single >= '0' && single <= '9') || single == '.') {//數據格式正確
//首字母不能為小數點
if([textField.text length] == 0){
if(single == '.'){
[textField.text stringByReplacingCharactersInRange:range withString:@""];
return NO;
}
}
//首位為0時,只能輸入小數點
if([textField.text length] == 1 && [textField.text isEqualToString:@"0"]){
if(single != '.'){
[textField.text stringByReplacingCharactersInRange:range withString:@""];
[RKDropdownAlert title:@"提示" message:@"首位為0時,只能輸入小數點"];
return NO;
}
}
if (single == '.') {
//text中還沒有小數點
if(!isHaveDian) {
isHaveDian = YES;
return YES;
}else {
//只能有一個小數點
[textField.text stringByReplacingCharactersInRange:range withString:@""];
return NO;
}
}else {
//存在小數點
if (isHaveDian) {
//判斷小數點的位數
NSRange ran = [textField.text rangeOfString:@"."];
NSInteger tt = range.location - ran.location;
if (tt <= 2){
return YES;
}else{
//小數點后最多兩位
return NO;
}
}else {
return YES;
}
}
}else{
//輸入的數據格式不正確 -> 金額只能輸入數字和小數點
[textField.text stringByReplacingCharactersInRange:range withString:@""];
return NO;
}
}else {
return YES;
}
}
}