【问题标题】:how to validate textfield that allows only single decimal point in textfield?如何验证文本字段中仅允许单个小数点的文本字段?
【发布时间】:2018-01-25 19:20:53
【问题描述】:

我需要限制用户只能输入小数点后两位数。我通过在文本字段委托 shouldChangeCharactersInRange 中的代码实现了这一点。但它允许输入多个点。如何限制这个?提前致谢。

            NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
            NSArray *sep = [newString componentsSeparatedByString:@"."];
            if([sep count]>=2)
            {
                NSString *sepStr=[NSString stringWithFormat:@"%@",[sep objectAtIndex:1]];
                NSLog(@"sepStr:%@",sepStr);

                return !([sepStr length]>2);
            }
            return YES;

【问题讨论】:

  • 请不要忘记不同的国家使用不同的小数分隔符。所以仅仅使用. 可能还不够。
  • @Gowtham:我刚刚使用了你的代码,只是多放了两行。它工作正常。忽略 NSLog。

标签: iphone ios validation uitextfield


【解决方案1】:

最好的方法是像这样在shouldChangeCharactersInRange:委托方法中使用Regular Expression

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

    NSString *newStr = [textField.text stringByReplacingCharactersInRange:range withString:string];

    NSString *expression = @"^([0-9]*)(\\.([0-9]+)?)?$";

    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:expression
                                                                           options:NSRegularExpressionCaseInsensitive
                                                                             error:nil];
    NSUInteger noOfMatches = [regex numberOfMatchesInString:newStr
                                                        options:0
                                                          range:NSMakeRange(0, [newStr length])];
    if (noOfMatches==0){
        return NO;
    }
    return YES;
}

实现此有效字符串后:
12.004546
4546.5456465
.5464
0.454

等等……

您还可以使用此Regular Expression

@"^([0-9]*)(\\.([0-9]{0,2})?)?$"

限制小数点后的整数个数

实现此有效字符串后:
12:00
4546.54
.54
0.45

【讨论】:

    【解决方案2】:
     -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
    
    NSString *sepStr;
    
    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
    
    NSArray *sep = [newString componentsSeparatedByString:@"."];
    if([sep count]>=2)
       {
            sepStr=[NSString stringWithFormat:@"%@",[sep objectAtIndex:1]];
            NSLog(@"sepStr:%@",sepStr);
            if([sepStr length] >2)
           {
            return NO;
           }
        else 
           {
            return YES;
           }
    
       }
       return YES;
     }
    

    【讨论】:

    • @Gowtham:我刚刚使用了你的代码,只是多放了两行。它工作正常。忽略 NSLog 。
    • & Nitin 我尝试了上述解决方案,但没有奏效。有没有做任何更改?
    【解决方案3】:

    当输入一个点时,你应该检查一个点是否已经存在,如果存在则返回NO。

     NSString * newString = [textField.text stringByReplacingCharactersInRange: range withString: string];
     NSArray * sep = [newString componentsSeparatedByString: @"."];
     if([string isEqualToString:@"."] && [sep count] > 1){
        //already a . is  there.. so don't allow new one
        return NO;
     }
     if ([sep count] >= 2) {
         NSString * sepStr = [NSString stringWithFormat: @"%@", [sep objectAtIndex: 1]];
         NSLog(@"sepStr:%@", sepStr);
    
         return !([sepStr length] > 2);
     }
     return YES;
    

    【讨论】:

      【解决方案4】:

      使用 reg ex "^([0-9]*)(\\.([0-9]+)?)?$" 更新了 Swift 3 的答案:

      func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
      
          let newText = ((textField.text ?? "") as NSString).replacingCharacters(in: range, with: string)
      
          let expression = "^([0-9]*)(\\.([0-9]+)?)?$"
      
          guard let regex = try? NSRegularExpression(pattern: expression, options: .caseInsensitive) else {
              return false
          }
          let noOfMatches = regex.numberOfMatches(in: newText, options: [], range: NSMakeRange(0, newText.characters.count))
      
          return noOfMatches > 0
      }
      

      【讨论】:

        【解决方案5】:

        你可以用这个方法:

        -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
        {
             NSRange temprange = [textField.text rangeOfString:@"."];
                if ((temprange.location != NSNotFound) && [string isEqualToString:@"."])
                {
                    return NO;
                }
            return YES;
        }
        

        【讨论】:

          【解决方案6】:
          NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
              NSArray *sep = [newString componentsSeparatedByString:@"."];
              if([string isEqualToString:@"."]){
                  if([textField.text containsString:@"."]){
                      return NO;
                  }
              }
              if([sep count] >= 2)
              {
                  NSString *sepStr=[NSString stringWithFormat:@"%@",[sep objectAtIndex:1]];
                  return !([sepStr length]>2);
              }
              return YES;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-06-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-25
            • 2016-05-22
            • 2012-03-25
            • 1970-01-01
            相关资源
            最近更新 更多