检查 UITextField 的输入是否仅为数值类型。

29 浏览
0 Comments

检查 UITextField 的输入是否仅为数值类型。

我如何验证UITextField的字符串输入?我想检查字符串是否为数字,包括小数点。

0
0 Comments

问题:如何检查UITextField的输入是否只包含数字?

原因:该问题的出现是因为需要对UITextField的输入进行验证,确保输入的内容只包含数字字符。

解决方法:可以使用以下几行代码来实现:

BOOL valid;
NSCharacterSet *alphaNums = [NSCharacterSet decimalDigitCharacterSet];
NSCharacterSet *inStringSet = [NSCharacterSet characterSetWithCharactersInString:myInputField.text];
valid = [alphaNums isSupersetOfSet:inStringSet];    
if (!valid) // Not numeric

上述代码使用了NSCharacterSet类来验证输入是否只包含数字字符。首先,创建了一个decimalDigitCharacterSet字符集,该字符集包含了所有的数字字符。然后,通过characterSetWithCharactersInString方法创建了一个inStringSet字符集,该字符集包含了UITextField输入框中的所有字符。最后,使用isSupersetOfSet方法比较两个字符集,如果inStringSet字符集不是alphaNums字符集的子集,说明输入中包含了非数字字符。

需要注意的是,上述解决方法并不能检查输入是否为浮点数或包含标点符号。

通过使用NSCharacterSet类和一些简单的判断逻辑,可以轻松地实现对UITextField输入是否只包含数字的验证。

0
0 Comments

在这段代码中,用户在一个Mac app中使用了这段代码,同样或类似的代码也可以在iPhone上使用。这段代码基于RegexKitLite正则表达式,当输入文本无效时,会将文本变为红色。

static bool TextIsValidValue( NSString* newText, double &value )
{
    bool result = false;
    if ( [newText isMatchedByRegex:@"^(?:|0|[1-9]\\d*)(?:\\.\\d*)?$"] ) {
        result = true;
        value = [newText doubleValue];
    }
    return result;
}
- (IBAction) doTextChanged:(id)sender;
{
    double value;
    if ( TextIsValidValue( [i_pause stringValue], value ) ) {
        [i_pause setTextColor:[NSColor blackColor]];
        // do something with the value
    } else {
        [i_pause setTextColor:[NSColor redColor]];
    }
}

问题原因:

- TextIsValidValue是一个静态C函数,意味着它是文件内部的局部函数,不属于任何对象。而()描述的是一个对象方法,类似于C++中的静态方法,与静态C函数(或静态变量)的概念完全不同。

- 正则表达式匹配了空字符串(不是数字)。

解决方法:

- 一般来说,在匹配输入的数字时,需要允许空字符串,否则用户无法输入例如"1<delete>2"这样的内容。

- 对于不了解正则表达式及其工作原理的开发者,可以简单地访问这个正则表达式解码网站,并复制/粘贴(?:|0|[1-9]\\d*)(?:\\.\\d*)来查看其含义。还可以参考正则表达式维基百科

需要注意的是,regex101.com非常好用,但请注意,regex101.com表示"警告:一个空的选择实际上使得该组可选,这意味着该选择是完全多余的",这是完全不正确的,因为它前面有一个^ - 这些选择项指定了空、0或1-9后跟零个或多个数字,而不是可选的,尽管根据个人喜好,你可能更愿意禁止".5"这样的输入。

0
0 Comments

UITextField输入只能是数字的问题可能出现的原因是用户需要确保输入的内容是数字,并且希望能够识别非法的输入。以下是几种解决方法:

1. 使用NSNumberFormatter的numberFromString:方法。如果能够正确解析字符串,它将返回一个NSNumber,否则返回nil。

2. 使用NSScanner。

3. 去除任何非数字字符,然后查看字符串是否仍然匹配。

4. 使用正则表达式。

在我看来,使用类似于-[NSString doubleValue]的方法可能不是最佳选择,因为@"0.0"和@"abc"的doubleValue都将是0。如果无法正确转换字符串,*value方法都会返回0,所以很难区分合法的字符串@"0"和非有效的字符串。类似于C语言的strtol函数也会有同样的问题。

我认为使用NSNumberFormatter是最佳选择,因为它考虑了地区设置的影响(例如,在欧洲使用数字@"1,23",而在美国使用数字@"1.23")。

然而,当我使用字符串"34jfkjdskj80"来使用numberFromString时,它返回的是数字3480,而不是返回nil。可能是我设置了NSNumberFormatter的选项有误。你的代码对我来说打印出的是"N: (null)"。

谢谢。我会仔细检查并与你的代码进行比较。

好吧,我复制了你的示例并运行了一下,现在我得到的结果是"N: 34"?奇怪。这是在iPhone SDK 3.0.1上进行的,如果这有关系的话。

- 我想我找到了原因。如果我将格式化器的行为更改为NSNumberFormatterBehavior10_0,现在它会显示"N: (null)"。

不要啊!似乎NSNumberFormatterBehavior10_0在iPhone SDK上不再可用了?我在控制台应用程序中尝试了这个示例,但是这个常量在iPhone上不再被识别了。

虽然这有点旧,但是如果有人正在阅读这篇文章,我认为值得指出,类似于NSScanner和NSNumberFormatter,当解析字符串时,NSScanner也会考虑地区设置,只要你在扫描器对象上使用setLocale:方法(例如,可以提供[NSLocale currentLocale])。

NSNumberFormatter的numberFromString方法非常直观。请参考下面的示例。

有些人喜欢读《战争与和平》,而其他人则喜欢《白鲸》。我个人觉得我只需下载Stack Overflow的数据集,过滤掉带有Dave答案的问题,然后就可以享受其中了。

[numberFromString:]没有文档说明在错误时返回nil。(请参见developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSNumberFormatter_Class/Reference/Reference.html)。我们可以依赖这种行为吗?

是的,您可以依赖这种行为。尽管可能没有文档说明,但多年来它一直是这样工作的,而且从二进制兼容性的角度来看,更改它是不可行的。

我们不能做一些类似于将输入乘以1或从输入中减去0的操作,然后根据结果来判断吗?如果乘以1后返回相同的值,那么它应该是一个数字,或者如果减去0后返回相同的值。如果是字符串,这些操作将没有意义-我认为。

0