標籤:
通常在編輯框中輸入一些貨品數量,金額時,我們都會做一些輸入的判斷限制。例如不能輸入非法字元,只能輸入數字等等。現把最近遇到的一些輸入限制需求展現如下:
1、 輸入小數位不能超過兩位;
2、 不能重複輸入小數點;
3、 不能輸入除數字以外的字元(但不包括退格鍵,負號鍵);
4、 限制長度為最小為1,最大為11。
為了實現以上需求,主要是依靠以下UITextFieldDelegate的一個協議方法來實現的:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{功能: 把textField中位置為range的字串替換為string字串; 此函數在textField內容被修改時調用;傳回值: YES,表示修改生效;NO,表示不做修改,textField的內容不變。參數說明: textField:響應UITextFieldDelegate協議的UITextField控制項。 range: UITextField控制項中游標選中的字串,即被替換的字串; range.length為0時,表示在位置range.location插入string。 string: 替換字串; string.length為0時,表示點擊了刪除delete鍵。
以下所有的代碼需要寫在該函數中。
1、 輸入小數位不能超過兩位
/** * 檢查浮點數小數位並校正小數點合法性 * * @param range 浮點數總長度 * @param dotPlaces 小數位 * @param decimal 浮點數 * @param string 當前輸入的數值 * * @return YES:沒有小數點或者限制兩位浮點數 NO */+ (BOOL)checkDecimalDotPlaces:(NSRange)range dotPlaces:(NSNumber *)dotPlaces decimal:(NSString *)decimal{ BOOL bHaveDot = false; if (dotPlaces.integerValue < 0) { dotPlaces = @0; } if ([decimal rangeOfString:@"."].location == NSNotFound){ bHaveDot = false; }else{ bHaveDot = true; } if (bHaveDot) { //判斷小數點的位元 NSRange ran = [decimal rangeOfString:@"."]; if (range.location - ran.location > dotPlaces.integerValue) { return NO; } } return YES;}
2、 不能重複輸入小數點
//不能再輸入小數點if ([string rangeOfString:@"."].location != NSNotFound && [textField.text rangeOfString:@"."].location == NSNotFound) {return NO;}
3、 不能輸入除數字以外的字元(但不包括退格鍵,負號鍵)
//不能輸入字串if ([string rangeOfString:@"."].location == NSNotFound) { NSRange range = [string rangeOfString:@"^[0-9-]+$" options:NSRegularExpressionSearch]; if (range.location == NSNotFound) { return NO; }}//刪除delete鍵if ([string isEqualToString:@""]) { return YES;}
4、 限制長度為最小為1,最大為11位
NSString *pwdRegex = @"[0-9]{1,10}";NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES%@",pwdRegex];if ([predicate evaluateWithObject:textField.text] || ![textField.text notEmpty]) { return YES;}else{ return NO;}
另外,對於字串的判斷可以選擇在NSString的分類擴充裡進行設定,如NSString+Extension。
總代碼如下:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ //不能再輸入小數點 if ([string rangeOfString:@"."].location != NSNotFound && [NSString isHaveDot:textField.text]) { return NO; } //delete if ([string isEqualToString:@""]) { return YES; } //不能輸入字串 if ([string rangeOfString:@"."].location == NSNotFound) { NSRange range = [string rangeOfString:@"^[0-9]+$" options:NSRegularExpressionSearch]; if (range.location == NSNotFound) { return NO; } } //限制長度為最小為1,最大為11位 NSString *pwdRegex = @"[0-9]{1,10}"; NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES%@",pwdRegex]; if ([predicate evaluateWithObject:textField.text] || ![textField.text notEmpty]) { return YES; }else{ return NO; } //限制小數位長度不超過2 if (![NSString checkDecimalDotPlaces:range dotPlaces:ZHJFloatDotPlaces decimal:textField.text]) { return NO; } return YES;}
【ios學習記錄】- UITextField輸入浮點數的限制