如何检查的NSString是数字或不

问题描述:

可能重复:
iphone how to check that a string is numeric only如何检查的NSString是数字或不

我有一个NSString的,然后我想检查字符串是数字或没有。

我的意思是

NSString *val = @"5555" ; 

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

我怎样才能在目标C做到这一点?

+1

什么算作一个数字?整型?浮点?科学计数法?带前导“0x”的十六进制?具有领先“0b”的二进制文件? – outis 2010-01-07 13:01:42

你可以使用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 
+0

这是不是有点矫枉过正?使用NSScanner或(不太可靠)只是在字符串上调用'floatValue'或'intValue'有什么问题?但是,即使对于包含数千位数字的数字,您的方法也会返回“YES”,这可能更有用。此外,你的字符集将被自动释放(如果它没有被运行时缓存)。 – dreamlax 2010-01-07 21:01:38

+1

@dreamlax:'NSScanner'和'* Value'方法都将接受以数字开头但其后有其他字符的字符串。根据OP的实际目的,这种行为可能会更好或可能不可接受。 'NSNumberFormatter'可能是最好的解决方案,因为它适用于浮点运算并考虑本地化。 – outis 2010-01-07 22:45:37

+0

这不是区域意识。 – 2014-07-08 12:12:10

使用[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基本上肯定比使用RegEx更好。 – RickDT 2012-03-07 15:19:23

+2

numberFromString是一个实例方法,而不是一个类方法,就像一个澄清。 – Matjan 2014-02-06 19:22:31