2010-01-07 16 views
16

Duplicar posible:
iphone how to check that a string is numeric only¿Cómo comprobar si NSString es numérico o no

tengo una NSString, entonces yo quiero comprobar la cadena es el número o no.

quiero decir

NSString *val = @"5555" ; 

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

¿Cómo puedo hacer esto en C Objetivo?

+1

¿Qué cuenta como número? Enteros? ¿Punto flotante? ¿Notación cientifica? Hexadecimal con "0x" adelantado Binario con "0b" adelantado – outis

Respuesta

8

Usted podría utilizar 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

¿No es esto un poco exagerado? ¿Qué hay de malo con usar un NSScanner o (menos confiablemente) simplemente llamando a 'floatValue' o' intValue' en la cadena? Sin embargo, su método devolverá 'SÍ 'incluso para números que constan de miles de dígitos, que pueden ser más útiles. Además, tu juego de caracteres se lanzará automáticamente (si el tiempo de ejecución no lo almacena en la memoria caché). – dreamlax

+1

@dreamlax: 'NSScanner' y los métodos' * Value' aceptarán cadenas que comiencen con un número pero que tengan otros caracteres después de eso. Dependiendo del propósito real del OP, este comportamiento puede ser mejor o puede ser inaceptable. 'NSNumberFormatter' es probablemente la mejor solución, ya que funciona en coma flotante y tiene en cuenta la localización. – outis

+0

Esto no es consciente de la configuración regional. –

66

Uso [NSNumberFormatter numberFromString: s]. Devuelve nil si la cadena especificada no es numérica. Puede configurar NSNumberFormatter para definir "numérico" para su escenario particular.


#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

Me gusta esta respuesta mucho mejor que el engañado. Usar Foundation es casi seguro preferible a usar un RegEx. – RickDT

+2

numberFromString es un método de instancia, no un método de clase, solo como una aclaración. – Matjan

Cuestiones relacionadas