2010-01-07 29 views
16

可能重複:
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

回答

8

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

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

+2

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