如何验证UITextField中的输入(例如,数字输入)

9
我对iPhone开发还比较新,有一个看起来很简单的问题我无法解决。如何验证用户在文本框中输入了数字和小数?我尝试了很多不同的方法,但最接近的只允许形式为5.34或23.89的数字字符串。我需要它允许像0.50或432.30这样的数字,只要最后一个输入值是零即可。我尝试通过将其转换为浮点数然后再转换回字符串来检查字符串输入,但得到了上述结果。任何帮助都将非常感激(包括示例代码!)谢谢!

2
你的链接无效了... - Jonathan Sterling
3个回答

13

我有类似的需求,解决方案最终证明是相当平凡的。不幸的是,许多与此问题相关的问题和回答都是关于验证或格式化数值,而不是控制用户输入。

以下实现shouldChangeCharactersInRange委托方法是我的解决方案。像往常一样,在这种情况下,RegularExpressions非常好用。RegExLib.com是一个非常好用的有用RegEx来源。我不是RegEx大师,总是有点难以组合它们,因此欢迎任何改进建议。

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    if (textField == self.quantityTextField)
    {
        NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];

        NSString *expression = @"^([0-9]+)?(\\.([0-9]{1,2})?)?$";
        NSError *error = nil;

        NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:expression 
                                                                               options:NSRegularExpressionCaseInsensitive 
                                                                                 error:&error];
        NSUInteger numberOfMatches = [regex numberOfMatchesInString:newString
                                                            options:0
                                                              range:NSMakeRange(0, [newString length])];        
        if (numberOfMatches == 0)
            return NO;        
    }

    return YES;
}

以上代码允许用户输入以下类型的值:1、1.1、1.11、.1、.11


这个也可以通过负浮点数 @"^(-)?([0-9]+)?(\.([0-9]{1,2})?)?$"。 - Aouiaiauo Eyjaajeyio

1
您可以将文本字段的内容转换为浮点数,并使用以下代码格式化它:
float myFloat = [myTextField floatValue];
NSString *formatString = [NSString stringWithFormat:@"%%1.%if", 2]; //2 decimals after point
NSString *resultString = [NSString stringWithFormat:formatString, myFloat];

如果您想在文本字段中仅允许数字值,您可以将resultString放回到您的textField中,这样任何不允许的文本都将被格式化的浮点值替换。
如果用户输入"abc12.4",结果将为"0"。因此最好使用UITextFieldDelegate方法:
textField:shouldChangeCharactersInRange:replacementString:

检查用户最后按下的键。您只需将其与数字值或点/逗号进行比较即可知道。


1
Dave DeLong 尝试发布的问题是 1320295,看起来非常相关。 这似乎是一个旧问题,你可能已经找到了解决方案,如果你能与大家分享就太好了 =)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接