如何检查一个NSString是否为数字

16

可能是重复问题:
iPhone如何检查字符串是否仅为数字

我有一个NSString,我想检查该字符串是否为数字。

我的意思是

NSString *val = @"5555" ;

if(val isNumber ){
  return true;
}else{
  retun false;
}

我该如何在Objective C中实现此功能?


1
什么算作数字?整数?浮点数?科学计数法?带有前导“0x”的十六进制?带有前导“0b”的二进制? - outis
2个回答

66

使用 [NSNumberFormatter numberFromString: s]。如果指定的字符串为非数字,则返回nil。您可以配置 NSNumberFormatter 来定义特定场景下的“数字”。


#import <Foundation/Foundation.h>

int
main(int argc, char* argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSLocale *l_en = [[NSLocale alloc] initWithLocaleIdentifier: @"en_US"];
    NSLocale *l_de = [[NSLocale alloc] initWithLocaleIdentifier: @"de_DE"];
    NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
    [f setLocale: l_en];

    NSLog(@"returned: %@", [f numberFromString: @"1.234"]);

    [f setAllowsFloats: NO];
    NSLog(@"returned: %@", [f numberFromString: @"1.234"]);

    [f setAllowsFloats: YES];
    NSLog(@"returned: %@", [f numberFromString: @"1,234"]);

    [f setLocale: l_de];
    NSLog(@"returned: %@", [f numberFromString: @"1,234"]);

    [l_en release];
    [l_de release];
    [f release];
    [pool release];
}

6
我更喜欢这个答案,比起重复的那个来说。使用 Foundation 库几乎肯定比沉溺于使用正则表达式更可取。 - RickDT
2
numberFromString是一个实例方法,而不是类方法,这只是一个澄清。 - Matjan

9
你可以使用 rangeOfCharacterFromSet: 方法:
@interface NSString (isNumber)
-(BOOL)isInteger;
@end

@interface _IsNumber
+(void)initialize;
+(void)ensureInitialization;
@end

@implementation NSString (isNumber)
static NSCharacterSet* nonDigits;
-(BOOL)isInteger {
    /* bit of a hack to ensure nonDigits is initialized. Could also 
       make nonDigits a _IsNumber class variable, rather than an 
       NSString class variable.
     */
    [_IsNumber ensureInitialization];
    NSRange nond = [self rangeOfCharacterFromSet:nonDigits];
    if (NSNotFound == nond.location) {
        return YES;
    } else {
        return NO;
    }
}
@end

@implementation _IsNumber
+(void)initialize {
    NSLog(@"_IsNumber +initialize\n");
    nonDigits = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
}
+(void)ensureInitialization {}
@end

这不是有点过度了吗?使用NSScanner或(可靠性较低)仅在字符串上调用floatValueintValue有什么问题吗?但是,您的方法甚至会返回由数千个数字组成的数字的“YES”,这可能更有用。此外,如果字符集未被运行时缓存,则会自动释放。 - dreamlax
1
@dreamlax:NSScanner*Value方法都可以接受以数字开头但后面有其他字符的字符串。根据OP的实际目的,这种行为可能更好,也可能是不可接受的。NSNumberFormatter可能是最好的解决方案,因为它适用于浮点数并考虑本地化。 - outis
这不是区域感知的。 - Rudolf Adamkovič
如果你有一个非常长的数字字符串,比如34位的跟踪号码,这也是非常有用的。 - TPoschel

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