Cómo convertir NSNumber a NSString

132

Entonces tengo un NSArray"myArray" con NSNumbersy NSStrings. Los necesito en otro, UIViewasí que voy así:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

DetailViewController *details = [[DetailViewController alloc] initWithNibName:@"DetailView" bundle:nil];
details.subjectText = [[myArray objectAtIndex:indexPath.row] objectForKey:@"subject"];

El subjectText funciona. Pero, ¿cómo puedo sacarle NSNumberprovecho? (Que en realidad los necesito como cadenas ...) Me gustaría convertir una NSStringsalida de un NSNumberasí: NSString *blah = [NSNumber intValue]. Pero no sé cómo configurarlo en el código anterior ...

dav3
fuente
Su matriz parece contener diccionarios, a juzgar por el uso de objectForKey. Por lo tanto, deberá extraer los valores apropiados de eso antes de intentar convertir. Tenga en cuenta que la mayoría de los tipos de objetos Cocoa, incluido NSNumber, se pueden convertir en cadenas llamando al descriptionmétodo (o utilizando %@una cadena de formato).
walkytalky
wow .. gracias walkytalky! ¿me puede indicar una documentación o dar un código de ejemplo para comprenderla? =)
dav3

Respuestas:

380

Tratar:

NSString *myString = [NSNumber stringValue];
JonLOo
fuente
3
pero debe tomar el NSNumber que está dentro de la matriz y luego llamar al método StringValue, algo como NSString * myString = [[myArray objectAtIndex: i] stringValue]; pero debes asegurarte de tener un NSNumber en ese índice
JonLOo
Prefiero descriptionWithLocale: [NSLocale currentLocale] porque funciona tanto para ints como para flotantes.
just.do.it
@JonLOo cuando se usa esto para un número específico, los valores decimales pierden valores exactos. Por ejemplo: NSNumber * num = [NSNumber numberWithDouble: 48.3]; NSString * strNumber = num.stringValue; da resultados como 48.299999; ¡Esto se vuelve crítico si es Monto y tiene que lidiar con el mundo real y multiplicarse con grandes números! ¿Cualquier pensamiento?
Visite el
hola @Vish, no he probado esta solución, así que no estoy seguro de si funcionará, intente formatearla de %festa manera: [NSString stringWithFormat:@"%f", yourDouble];
JonLOo
"No se conoce ningún método de clase para el selector 'stringValue'" <- stringValue no es una función de clase, por lo que no puede invocarlo directamente en NSNumber. La respuesta de rhalgravez lo hace correctamente.
user1021430
13

Puedes hacerlo con:

NSNumber *myNumber = @15;
NSString *myNumberInString = [myNumber stringValue];
rhalgravez
fuente
7
//An example of implementation :
// we set the score of one player to a value
[Game getCurrent].scorePlayer1 = [NSNumber numberWithInteger:1];
// We copy the value in a NSNumber
NSNumber *aNumber = [Game getCurrent].scorePlayer1;
// Conversion of the NSNumber aNumber to a String with stringValue
NSString *StringScorePlayer1 = [aNumber stringValue];
fcoque
fuente
5

o tratar NSString *string = [NSString stringWithFormat:@"%d", [NSNumber intValue], nil];

sbs
fuente
8
Esto hace dos conversiones. Uno para convertir NSNumber en intValue y otro para forzar el intValue resultante en un NSString. Usar esto puede ser pequeño para algunos, pero eliminarlo es una excelente manera de guardar pequeños ciclos computacionales ... que pueden sumar.
Jann
Esto supone que los números que se almacenan son ints. ¿Qué pasa si no sabe el tipo de número almacenado?
James Webster
3

Lo curioso es que NSNumber se convierte en cadena automáticamente si se convierte en parte de una cadena. No creo que esté documentado. Prueba estos:

NSLog(@"My integer NSNumber:%@",[NSNumber numberWithInt:184]);
NSLog(@"My float NSNumber:%@",[NSNumber numberWithFloat:12.23f]);
NSLog(@"My bool(YES) NSNumber:%@",[NSNumber numberWithBool:YES]);
NSLog(@"My bool(NO) NSNumber:%@",[NSNumber numberWithBool:NO]);

NSString *myStringWithNumbers = [NSString stringWithFormat:@"Int:%@, Float:%@ Bool:%@",[NSNumber numberWithInt:132],[NSNumber numberWithFloat:-4.823f],[NSNumber numberWithBool:YES]];
NSLog(@"%@",myStringWithNumbers);

Imprimirá:

My integer NSNumber:184
My float NSNumber:12.23
My bool(YES) NSNumber:1
My bool(NO) NSNumber:0
Int:132, Float:-4.823 Bool:1

Funciona tanto en Mac como en iOS

Este no funciona:

NSString *myNSNumber2 = [NSNumber numberWithFloat:-34512.23f];
Tibidabo
fuente
2
Esto está documentado: el %@especificador de formato enviará el -descriptionmensaje al objeto receptor correspondiente. Usted puede hacer su última línea de trabajo con el mismo espíritu de la escritura: NSString *myNSNumber2 = [[NSNumber numberWithFloat:-34512.23f] description];. Por lo que puedo decir, NSNumberlos métodos descriptiony stringValuehacen lo mismo.
Jean-Denis Muys
2

En Swift puedes hacer así

let number : NSNumber = 95
let str : String = number.stringValue
Singhak
fuente
2

En Swift 3.0

let number:NSNumber = 25
let strValue = String(describing: number as NSNumber)
print("As String => \(strValue)")

Podemos obtener el valor numérico en String.

Gautam Sareriya
fuente