1

我已经尝试使用以下代码

这有助于我允许用户只输入数字和点(小数点)

问题是用户可以在此方法中允许 n 位小数。

我只想允许一位小数

小数点后只有两位数

像 123.00 , 123423432353.99 但不像 123.4.4 , 123.12345, 123...23

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


      if (string.length == 0) {
            return YES;
      }
      NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789."];
      for (int i = 0; i < [string length]; i++) {
            unichar c = [string characterAtIndex:i];
            if ([myCharSet characterIsMember:c]) {
                  return YES;
            }
      }
      UIAlertView *av = [[UIAlertView alloc] initWithTitle:nil message:@"Invalid input" delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles:nil];
      [av show];
      return NO;

}

如何允许用户只输入一位小数的文本字段也只允许小数点后两位

提前致谢

4

2 回答 2

5

最佳实践当您必须执行任何字符串格式验证(如电子邮件、电话号码、货币等)时,请使用正则表达式。

这肯定会解决你的问题。下面是示例代码:

首先创建 NSRegularExpression 的实例

NSError error;
NSRegularExpression * regExp = [[NSRegularExpression alloc]initWithPattern:@"^\\d{0,10}(([.]\\d{1,2})|([.]))?$" options:NSRegularExpressionCaseInsensitive error:&error];

然后在您的相关方法中使用:

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

    NSString * existingText = textField.text;
    NSString * completeText = [existingText stringByAppendingFormat:@"%@",string];

    if ([regExp numberOfMatchesInString:completeText options:0 range:NSMakeRange(0, [completeText length])]) 
    {
        if ([completeText isEqualToString:@"."])
        [textField insertText:@"0"];
        return YES;
    }
    else
     return NO;
 }

使用并让我知道它是否有效。

于 2013-05-04T10:20:13.587 回答
1

请尝试使用这个...它可能对您有所帮助,请实现您的功能。此代码仅用于“。”之后的 2 位数字。

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

    NSArray *sep = [newString componentsSeparatedByString:@"."];
    if([sep count]>=2)
    {
        NSString *sepStr=[NSString stringWithFormat:@"%@",[sep objectAtIndex:1]];
        return !([sepStr length]>2);
    }
    return YES;
于 2013-05-04T10:15:06.810 回答