2010-09-01 21 views
5

Estoy tratando de convertir un objeto NSString a un NSNumber con el mismo valor numérico. Cuando creo el objeto NSString usando esta declaración ...¿Por qué la clase NSNumber no está convirtiendo correctamente mi objeto NSString en algo largo?

NSString *songID = [localNotif.userInfo objectForKey:@"SongID"]; 

la var songID contiene el valor de cadena @"10359537395704663785". y cuando intento para convertirlo en un objeto NSNumber utilizando la sentencia ...

NSNumber *songIDNumber = [NSNumber numberWithLongLong:[songID longLongValue]]; 

la var songIDNumber contiene el valor incorrecto de 9223372036854775807

¿Qué estoy haciendo mal? También podría valer la pena observar que a veces este código funciona y produce el valor de NSNumber correcto, pero la mayoría de las veces falla como se muestra arriba.

Gracias de antemano por su ayuda!

ACTUALIZACIÓN: Dios I love this site! Gracias a unbeli y Carl, yo era capaz de arreglarlos con el código actualizado para la conversión de la NSString a la NSNumber ...

unsigned long long ullvalue = strtoull([songID UTF8String], NULL, 0); 
NSNumber *songIDNumber = [NSNumber numberWithUnsignedLongLong:ullvalue]; 

Respuesta

4

9223372036854775807 decimal es 0x7FFFFFFFFFFFFFFF en hexadecimal. Su número es 10359537395704663785, que es demasiado grande para long long y se desborda. Desde el NSString documentation:

devoluciones LLONG_MAX o LLONG_MIN en caso de desbordamiento.

5

longLongValuereturnsLLONG_MAX en caso de desbordamiento, y LLONG_MAX es exactamente lo que se obtiene, 9223372036854775807. valor que simplemente no encaja en long long

Trate de usar NSDecimalNumber lugar.

Cuestiones relacionadas