2010-01-07 26 views
16

Olası Çoğalt nasıl
iphone how to check that a string is numeric onlyNSString sayısal olup olmadığını kontrol ya da değil

Bir NSString var, o zaman ben dizesini kontrol istediğiniz numara veya değildir.

ben Objective C yapabilirsiniz nasıl

NSString *val = @"5555" ; 

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

demek?

+1

Numara olarak ne sayılır? Tamsayılar? Kayan nokta? Bilimsel gösterim? Öncelikli "0x" ile onaltılık? Öncü "0b" ile ikili? – outis

cevap

8

Sen rangeOfCharacterFromSet: kullanabilirsiniz:

@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

Bu biraz aşırı değil mi? NSScanner kullanmanın ya da (daha az güvenilir) dize üzerinde floatValue' veya 'intValue' kelimesini çağırmanın nesi yanlış? Bununla birlikte, yönteminiz binlerce basamaktan oluşan sayılar için bile daha yararlı olabilecek "YES" i döndürecektir. Ayrıca, karakter kümeniz otomatik olarak yüklenecektir (çalışma zamanı tarafından önbelleğe alınmamışsa). – dreamlax

+1

@dreamlax: 'NSScanner' ve' * Value' yöntemleri, bir sayı ile başlayan ancak bundan sonra başka karakterleri olan dizeleri kabul edecektir. OP'nin asıl amacına bağlı olarak, bu davranış daha iyi olabilir veya kabul edilemez olabilir. 'NSNumberFormatter', kayan nokta için çalıştığından ve yerelleştirmeyi dikkate aldığından muhtemelen en iyi çözümdür. – outis

+0

Bu, yerel ayarın farkında değil. –

66

kullanın [NSNumberFormatter numberFromString: s]. Belirtilen dize sayısal değilse, nil değerini döndürür. NSNumberFormatter'ı, özel senaryonuz için "sayısal" olarak tanımlayacak şekilde yapılandırabilirsiniz.


#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

Bu cevabı dupe'den çok daha iyi seviyorum. Vakfın kullanılması, kesinlikle bir RegEx kullanmanın batmasına kesinlikle tercih edilir. – RickDT

+2

numberFromString, bir sınıflandırma yöntemi değil, bir örnek yöntemdir. – Matjan

İlgili konular