检查UITextField的输入是否仅为数字

g.r*_*ion 82 validation cocoa-touch objective-c nsstring uitextfield

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

Don*_*air 115

您可以通过以下几行来完成:

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

- 这是用于验证输入仅为数字字符.查看NSCharacterSet其他选项的文档.您可以使用characterSetWithCharactersInString指定任何有效输入字符集.

  • 这个答案不会检查双打或标点符号 (22认同)

Dav*_*ong 72

有几种方法可以做到这一点:

  1. 使用NSNumberFormatter的numberFromString:方法.如果NSNumber可以正确解析字符串,或者不能解析字符串,则返回NSNumber nil.
  2. 使用NSScanner
  3. 删除任何非数字字符并查看字符串是否仍然匹配
  4. 使用正则表达式

IMO,使用类似-[NSString doubleValue]将不会是最好的选择,因为两者@"0.0"@"abc"会有一个0的doubleValue的*值的方法都返回0,如果他们不能将字符串正确转换,所以这将是一个很难区分合法字符串@"0"和无效字符串.像C的strtol功能会有同样的问题.

我认为使用NSNumberFormatter是最好的选择,因为它考虑了区域设置(即@"1,23"欧洲的数字,而@"1.23"美国的数字).

  • @Tony是的我不知道你在做什么,因为以下记录"N:(null)"对我来说:`NSNumberFormatter*f = [[NSNumberFormatter alloc] init]; NSNumber*n = [f numberFromString:@"34jfkjdskj80"]; NSLog(@"N:%@",n);` (5认同)
  • 这有点旧,但是如果有人正在读这个,我认为应该值得注意的是`NSScanner`,如`NSNumberFormatter`,在解析字符串时会考虑语言环境,前提是你使用`setLocale:`扫描程序对象(例如,你可以提供`[NSLocale currentLocale]`). (2认同)

Pet*_*wis 34

我在我的Mac应用程序中使用此代码,相同或类似的应该与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]];
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,这是一个非常古老的答案,我知道,但我认为静态方法声明如下:`+(BOOL)TextIsValidValue:(NSString*)newText:(double)&value:`... (7认同)
  • TextIsValidValue是一个静态C函数,这意味着它是文件的本地函数,并且不是任何对象的一部分.您(@RCIX)正在描述一个对象方法,它类似于C++中的静态方法,并且是一个与静态C函数(或者就此而言的静态变量!)完全不同的概念. (7认同)
  • 对于那些不知道*正则表达式*或它们如何工作的开发人员,只需转到[此正则表达式解码器wesbite](https://regex101.com/)并复制/粘贴`(?:| 0 | [1 -9] \\ d*)(?:\\.\\ d*)`看看它意味着什么.另见[Regex Wikipedia](https://en.wikipedia.org/wiki/Regular_expression) (5认同)

Fra*_*rar 19

如果您希望仅允许用户输入数字,则可以使ViewController实现UITextFieldDelegate的一部分并定义此方法:

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

  // The user deleting all input is perfectly acceptable.
  if ([resultingString length] == 0) {
    return true;
  }

  NSInteger holder;

  NSScanner *scan = [NSScanner scannerWithString: resultingString];

  return [scan scanInteger: &holder] && [scan isAtEnd];
}
Run Code Online (Sandbox Code Playgroud)

可能有更有效的方法,但我发现这是一种非常方便的方式.并且该方法应该很容易适用于验证双打或其他:只需使用scanDouble:或类似的.


kal*_*ani 13

#pragma mark - UItextfield Delegate

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    if ([string isEqualToString:@"("]||[string isEqualToString:@")"]) {
        return TRUE;
    }

    NSLog(@"Range ==%d  ,%d",range.length,range.location);
    //NSRange *CURRANGE = [NSString  rangeOfString:string];

    if (range.location == 0 && range.length == 0) {
        if ([string isEqualToString:@"+"]) {
            return TRUE;
        }
    }
    return [self isNumeric:string];
}

-(BOOL)isNumeric:(NSString*)inputString{
    BOOL isValid = NO;
    NSCharacterSet *alphaNumbersSet = [NSCharacterSet decimalDigitCharacterSet];
    NSCharacterSet *stringSet = [NSCharacterSet characterSetWithCharactersInString:inputString];
    isValid = [alphaNumbersSet isSupersetOfSet:stringSet];
    return isValid;
}
Run Code Online (Sandbox Code Playgroud)


小智 11

以下是几个单行结合Peter Lewis的上述答案(检查UITextField的输入是否只是数字)和NSPredicates

    #define REGEX_FOR_NUMBERS   @"^([+-]?)(?:|0|[1-9]\\d*)(?:\\.\\d*)?$"
    #define REGEX_FOR_INTEGERS  @"^([+-]?)(?:|0|[1-9]\\d*)?$"
    #define IS_A_NUMBER(string) [[NSPredicate predicateWithFormat:@"SELF MATCHES %@", REGEX_FOR_NUMBERS] evaluateWithObject:string]
    #define IS_AN_INTEGER(string) [[NSPredicate predicateWithFormat:@"SELF MATCHES %@", REGEX_FOR_INTEGERS] evaluateWithObject:string]
Run Code Online (Sandbox Code Playgroud)