UITextField限制两位小数的输入

119 阅读1分钟

UITextField限制两位小数的输入

OC版本

#pragma mark ************ UITextFieldDelegate ************
//参数一:range,要被替换的字符串的range,如果是新输入的,就没有字符串被替换,range.length = 0
//参数二:替换的字符串,即键盘即将输入或者即将粘贴到textField的string
//返回值为BOOL类型,YES表示允许替换,NO表示不允许
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    //新输入的
    if (string.length == 0) return YES;

   //第一个参数,被替换字符串的range
   //第二个参数,即将键入或者粘贴的string
   //返回的是改变过后的新str,即textfield的新的文本内容
    NSString *checkStr = [textField.text stringByReplacingCharactersInRange:range withString:string];

    //正则表达式(只支持两位小数)
    NSString *regex = @"^\-?([1-9]\d*|0)(\.\d{0,2})?$";
   //判断新的文本内容是否符合要求
    return [self isValid:checkStr withRegex:regex];
}

//检测改变过的文本是否匹配正则表达式,如果匹配表示可以键入,否则不能键入
- (BOOL) isValid:(NSString*)checkStr withRegex:(NSString*)regex
{
    NSPredicate *predicte = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
    return [predicte evaluateWithObject:checkStr];
}

Swift版本

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
   // 新输入的
   if string.isEmpty {
       return true
   }
            
   // 被替换后的新字符串
   let checkStr = (textField.text! as NSString).replacingCharacters(in: range, with: string)
            
      // 正则表达式(只支持两位小数)
      let regex = "^\\-?([1-9]\\d*|0)(\\.\\d{0,2})?$"
            
      // 判断新字符串是否符合要求
      return isValid(checkStr, withRegex: regex)
}

func isValid(_ checkStr: String, withRegex regex: String) -> Bool {
    let predicate = NSPredicate(format: "SELF MATCHES %@", regex)
    return predicate.evaluate(with: checkStr)
}