【ios学习记录】- UITextField输入浮点数的限制

通常在编辑框中输入一些货品数量,金额时,我们都会做一些输入的判断限制。例如不能输入非法字符,只能输入数字等等。现把最近遇到的一些输入限制需求展现如下:

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:没有小数点或者限制两位浮点数
 */

+ (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) {
      //判断小数点的位数
      NSRangeran = [decimal rangeOfString:@"."];

      if(range.location- ran.location > dotPlaces.integerValue) {    
      returnNO;
    }
 }
    returnYES;
}

2、不能重复输入小数点

//不能再输入小数点

if ([string rangeOfString:@"."].location != NSNotFound&& [textField.text rangeOfString:@"."].location ==NSNotFound) {

returnNO;

}

3、不能输入除数字以外的字符(但不包括退格键,负号键)

     //不能输入字符串
       if ([string rangeOfString:@"."].location == NSNotFound)              {
            NSRange range = [string rangeOfString:@"^[0-9-]+$"options:NSRegularExpressionSearch];
            if(range.location== NSNotFound) {
                 returnNO; 
            }
       }

    //删除delete键
      if([string isEqualToString:@""])
      {
            returnYES;
      }

4、限制长度为最小为1位,最大为11位

    NSString*pwdRegex = @"[0-9]{1,10}";
    NSPredicate*predicate = [NSPredicate predicateWithFormat:@"SELFMATCHES%@",pwdRegex];

    if([predicate evaluateWithObject:textField.text]|| ![textField.text notEmpty]) {
        returnYES;
    }else{
        returnNO;
    }

另外,对于字符串的判断可以选择在NSString的分类扩展里进行设置,如NSString+Extension。

总代码如下:

- (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)string{

    //不能再输入小数点
    if ([string rangeOfString:@"."].location != NSNotFound&& [NSStringisHaveDot:textField.text]) {
        returnNO;
    }

    //delete
    if ([string isEqualToString:@""]) {
        returnYES;

    }

    //不能输入字符串
    if ([string rangeOfString:@"."].location == NSNotFound) {
        NSRangerange = [string rangeOfString:@"^[0-9]+$"options:NSRegularExpressionSearch];
         if(range.location== NSNotFound) {     
              returnNO;
         }
    }

    //限制长度为最小为1,最大为11位
    NSString *pwdRegex = @"[0-9]{1,10}";
    NSPredicate*predicate = [NSPredicate predicateWithFormat:@"SELFMATCHES%@",pwdRegex];

    if([predicate evaluateWithObject:textField.text]|| ![textField.text notEmpty]) {
        returnYES;
    }else{
        returnNO;
    }
         
    //限制小数位长度不超过2
    if (![NSString checkDecimalDotPlaces:range dotPlaces:ZHJFloatDotPlaces decimal:textField.text]) {
         returnNO;
    }

    returnYES;
}

你可能感兴趣的:(【ios学习记录】- UITextField输入浮点数的限制)