Comment convertir NSNumber en NSString

132

J'ai donc un NSArray"myArray" avec NSNumbers et NSStrings. J'en ai besoin dans un autre UIViewalors je vais comme ça:

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

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

Le subjectText fonctionne. Mais comment puis-je en retirer le NSNumbers? (Je les ai réellement besoin comme des chaînes ...) Je convertir un NSStringd'un NSNumbercomme celui - ci: NSString *blah = [NSNumber intValue]. Mais je ne sais pas comment le configurer dans le code ci-dessus ...

dav3
la source
Votre tableau semble en fait contenir des dictionnaires, à en juger par l'utilisation de objectForKey. Vous devrez donc en extraire les valeurs appropriées avant de tenter de convertir. Notez que la plupart des types d'objets Cocoa, y compris NSNumber, peuvent être convertis en chaînes en appelant la descriptionméthode (ou en utilisant %@dans une chaîne de format).
walkytalky
wow .. merci walkytalky! pouvez-vous me diriger vers une documentation ou donner un exemple de code pour la comprendre? =)
dav3

Réponses:

380

Essayer:

NSString *myString = [NSNumber stringValue];
JonLOo
la source
3
mais vous devriez prendre le NSNumber qui se trouve à l'intérieur du tableau, puis appeler la méthode StringValue, quelque chose comme NSString * myString = [[myArray objectAtIndex: i] stringValue]; mais vous devez être sûr que vous avez un NSNumber à cet index
JonLOo
Je préfère descriptionWithLocale: [NSLocale currentLocale] car il fonctionne à la fois pour les entiers et les flottants.
just.do.it
@JonLOo lorsque vous l'utilisez pour un nombre spécifique, les valeurs décimales perdent des valeurs exactes. Par exemple: NSNumber * num = [NSNumber numberWithDouble: 48,3]; NSString * strNumber = num.stringValue; donne les résultats 48,299999; cela devient critique si son montant et doit traiter dans le monde réel et multiplié par de grands nombres. !! Toute pensée?
Vish
Salut @Vish, je n'ai pas essayé cette solution, donc je ne suis pas sûr si cela fonctionnera, essayez de la formater avec %fce qui [NSString stringWithFormat:@"%f", yourDouble];
suit
"Aucune méthode de classe connue pour le sélecteur 'stringValue'" <- stringValue n'est pas une fonction de classe, vous ne pouvez donc pas l'appeler directement sur NSNumber. La réponse de rhalgravez le fait correctement.
user1021430
13

Vous pouvez le faire avec:

NSNumber *myNumber = @15;
NSString *myNumberInString = [myNumber stringValue];
rhalgravez
la source
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
la source
5

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

sbs
la source
8
Cela fait deux conversions. Un pour transformer NSNumber en intValue et un pour forcer l'intValue résultante en NSString. L'utilisation de cela peut être petite pour certains, mais la supprimer est un excellent moyen d'économiser de petits cycles de calcul ... qui peuvent s'additionner.
Jann
Cela suppose que les nombres stockés sont des entiers. Et si vous ne connaissez pas le type de numéro stocké?
James Webster
3

Ce qui est drôle, c'est que NSNumber se convertit automatiquement en chaîne s'il devient une partie d'une chaîne. Je ne pense pas que ce soit documenté. Essayez ceci:

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);

Il imprimera:

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

Fonctionne sur Mac et iOS

Celui-ci ne fonctionne pas:

NSString *myNSNumber2 = [NSNumber numberWithFloat:-34512.23f];
Tibidabo
la source
2
Ceci est documenté: le %@spécificateur de format enverra le -descriptionmessage à l'objet récepteur correspondant. Vous pouvez faire votre dernier travail en ligne dans le même esprit en écrivant: NSString *myNSNumber2 = [[NSNumber numberWithFloat:-34512.23f] description];. Pour autant que je peux dire, NSNumber« s descriptionet les stringValueméthodes font la même chose.
Jean-Denis Muys
2

Dans Swift, vous pouvez faire comme ça

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

Dans Swift 3.0

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

Nous pouvons obtenir la valeur numérique dans String.

Gautam Sareriya
la source