2010-02-16 15 views
17

Necesito comprobar si un carácter es un dígito o no.¿Cómo comprobar si un carácter es un dígito o no en Objective-C?

NSString *[email protected]"Test55"; 
char c =[strTest characterAtIndex:4]; 

Necesito averiguar si 'c' tiene un dígito o no. ¿Cómo puedo implementar esta verificación en Objective-C?

+5

cuidadosa, 'characterAtIndex:' 'devuelve un unichar' , no un "char" Truncado como este podría llevar a falsos positivos si se trata de texto no ASCII. – dreamlax

Respuesta

20

En la norma C hay una función int isdigit(int ch); definida en "ctype.h". Devolverá distinto de cero (VERDADERO) si ch es un dígito.

También puede comprobar manualmente:

if(c>='0' && c<='9') 
{ 
    //c is digit 
} 
+0

Thnx mucho ... Tengo una pregunta ?? Cómo convertir el unichar a int? Acabo de probar lo siguiente int ivalue = [[NSNumber numberWithChar: cChar] intValue]; ¿Es correcto? – syam

+0

@syam: no necesita saltar tantos aros. Debería poder convertir 'unichar' a' int' haciendo 'int ivalue = cChar;' – dreamlax

+3

¿Qué pasa si son números japoneses '-' - '九'? – amphetamachine

1

Es posible que desee comprobar NSCharacterSet referencia de clase.

0

Se puede pensar en escribir una función genérica como la siguiente para ello:

BOOL isNumericI(NSString *s) 
{ 
    NSUInteger len = [s length]; 
    NSUInteger i; 
    BOOL status = NO; 

    for(i=0; i < len; i++) 
    { 
     unichar singlechar = [s characterAtIndex: i]; 
     if ((singlechar == ' ') && (!status)) 
     { 
     continue; 
     } 
     if ((singlechar == '+' || 
       singlechar == '-') && (!status)) { status=YES; continue; } 
     if ((singlechar >= '0') && 
      (singlechar <= '9')) 
     { 
      status = YES; 
     } else { 
      return NO; 
     } 
    } 
    return (i == len) && status; 
} 
+0

Esta función no hace lo que el OP solicitó. Además, un 'NSScanner' lo liberará de gran parte del esfuerzo que su función presenta. – dreamlax

29

Nota: El valor de retorno para characterAtIndex: no es un char, sino una unichar. Por lo tanto la fundición como esto puede ser peligroso ...

Un código alternativa sería:

NSString *strTest = @"Test55"; 
unichar c = [strTest characterAtIndex:4]; 
NSCharacterSet *numericSet = [NSCharacterSet decimalDigitCharacterSet]; 
if ([numericSet characterIsMember:c]) { 
    NSLog(@"Congrats, it is a number..."); 
} 
2

Esto es en realidad bastante simple:

isdigit([YOUR_STRING characterAtIndex:YOUR_POS]) 
+1

Respondí esta respuesta, pero solo porque todo lo que quiero es 0-9 (porque estoy tratando con un lenguaje de programación, no con lenguajes de usuario). Si tuviera que lidiar con lenguajes de usuario, probablemente querría usar la solución 'decimalDigitCharacterSet'. http://stackoverflow.com/a/2271360/901641 – ArtOfWarfare

Cuestiones relacionadas