2011-03-05 24 views

Respuesta

20
BOOL hasLeadingNumberInString(NSString* s) { 
if (s) 
    return [s length] && isnumber([s characterAtIndex:0]); 
else 
    return NO; 

}

En t Si está manejando muchas NSStrings a la vez (como recorrer una matriz) y desea verificar el formato de cada uno, como los números iniciales, es mejor incluir cheques para que no intente evaluar una cadena vacía o inexistente.

Ejemplo:

NSString* s = nil; //Edit: s needs to be initialized, at the very least, to nil. 
hasLeadingNumberInString(s);   //returns NO 
hasLeadingNumberInString(@"");  //returns NO 
hasLeadingNumberInString(@"0123abc"); //returns YES 
+0

me gusta este. Muchas aplicaciones se cuelgan cuando aparece una cadena inesperada nulo o de longitud cero. Los desarrolladores nunca intentan dejar el campo en blanco u otras rarezas. –

+0

NSString * s; hasLeadingNumberInString (s); // devuelve NO no va a funcionar, ya que s es un número aleatorio, no es nulo. (punto menor que el método es correcto, solo use NSString * s = nil; para la prueba. –

+0

Tom es correcto. Mi método asume que s es, al menos, inicializar a cero o algo más. – Beljoda

5

Comprobar el valor de retorno de:

[myString rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet]]; 

Si el valor de la gama location devuelto es 0, que tiene un partido en el primer carácter.

+1

Esto podría ser muy lento para las cadenas largas, y si el usuario introduce la stting podría ser de cualquier longitud. (Consulte el comentario de la orden (N)) –

+0

¿Ha comprobado realmente que el método escanea toda la cadena? Sería realmente mal implementado si lo hiciera. De la documentación: "Encuentra y devuelve el rango en el receptor del primer personaje de un juego de caracteres determinado". Me parece que le gusta que se detenga una vez que encuentra una coincidencia. –

+0

Pensando más en ello, lo que dije antes debería ser cierto al menos si hay una coincidencia positiva en el primer personaje. De lo contrario, la cadena se analizará por completo (en el peor de los casos cuando no haya una coincidencia en toda la cadena). –

8

Sí. Usted puede hacer:

NSString *s = ...; // a string 
unichar c = [s characterAtIndex:0]; 
if (c >= '0' && c <= '9') { 
    // you have a number! 
} 
+1

O incluso isdigit ([s characterAtIndex: 0])? – Tommy

7

Puedo pensar en dos maneras de hacerlo. Se podría utilizar

[string rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet]].location == 0 

O usted podría utilizar

[[NSCharacterSet decimalDigitCharacterSet] characterIsMember:[string characterAtIndex:0]] 
+0

No usaría ninguno de estos. Escanean la cadena o (N). Si solo le importa el primer carácter, se debe usar una solución o (1). – Scott

+0

El segundo no analiza la cadena. Dependiendo de cómo se implemente NSCharacterSet, podría escanear el conjunto o podría ser una prueba muy parecida a su respuesta a continuación. – Anomie

+0

También podría ser que decimalDigitCharacterSet arroje un objeto autorellenado asignado que cuando se lo llama muchas veces matará el rendimiento. –

4

En lugar de utilizar una llamada que escanea toda la cadena, lo mejor es sacar el primer carácter a continuación, ver lo que es:

char test = [myString characterAtIndex:0]; 
if (test >= '0' && test <= '9') 
    return YES 
else 
    return NO 
Cuestiones relacionadas