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

时间:2009-09-16 18:01:22

标签: iphone objective-c validation uitextfield numbers

我是iPhone开发的新手,我有一个似乎是一个简单的问题,我无法弄清楚。如何验证用户在文本字段中输入数字和小数?

我尝试了很多不同的东西,但我能得到的关闭只允许形式的数字字符串:5.34或23.89。我需要它来允许数字,如; 0.50或432.30,只是最后一个输入值为零的东西。我尝试通过将字符串输入转换为浮点数然后返回字符串来检查字符串输入,但得到上述结果。

任何帮助都会很棒(与示例代码一样!)谢谢!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

Dave DeLong试图发布的问题是1320295,看起来非常相关。 这似乎是一个老问题,你可能找到了你的解决方案,如果你分享它会很好=)

答案 2 :(得分:1)

您可以使用以下代码将文本字段的内容转换为浮动并格式化:

float myFloat = [myTextField floatValue];
NSString *formatString = [NSString stringWithFormat:@"%%1.%if", 2]; //2 decimals after point
NSString *resultString = [NSString stringWithFormat:formatString, myFloat];

如果您只想在文本字段中允许数值,则可以在textField中重新输入resultString,这样任何不允许的文本都将被格式化的浮点值替换。

如果用户输入“abc12.4”,结果将为“0”。所以如果你使用UITextFieldDelegate方法会更好:

textField:shouldChangeCharactersInRange:replacementString:

检查用户点击的最后一个键。你可以比较它,知道它是数字值还是点/逗号。