9

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

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

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

4

3 回答 3

13

我有类似的要求,但最终结果证明解决方案相当简单。不幸的是,与此问题相关的许多问题和答案都是关于验证或格式化数值,而不是控制用户可以输入的内容。

shouldChangeCharactersInRange 委托方法的以下实现是我的解决方案。与往常一样,正则表达式在这种情况下很重要。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

于 2012-02-19T20:27:24.677 回答
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:

检查用户点击的最后一个键。您可以比较它以了解它是数值还是点/逗号。

于 2010-02-19T08:57:25.117 回答
1

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

于 2010-02-16T19:18:27.067 回答