2009-07-25 2 views
22

J'ai une valeur longue longue non signée que je souhaite stocker dans une chaîne NSString et extraire de la chaîne.Enregistrement et récupération d'une valeur longue non signée vers/depuis NSString

Au départ, j'ai la valeur dans un NSNumber et je me sers de ce pour obtenir la chaîne

NSString *numStr = [NSString stringWithFormat:@"%llu", [myNum unsignedLongLongValue]]; 

où myNum est un NSNumber.

Pour récupérer le NSNumber de la chaîne NSS, je dois d'abord obtenir la valeur longue non signée. Mais il n'y a pas de méthode dans la classe NSString pour faire cela (nous en avons juste une pour obtenir la valeur longue longue, pas la valeur longue non signée). Est-ce que quelqu'un peut me dire comment je peux récupérer la valeur dans une variable NSNumber.

Merci.

Répondre

56

Il y a plusieurs façons d'y parvenir. Ce qui suit est la plus pragmatique:

NSString *numStr = [NSString stringWithFormat:@"%llu", [myNum unsignedLongLongValue]]; 

// .. code and time in between when numStr was created 
// .. and now needs to be converted back to a long long. 
// .. Therefore, numStr used below does not imply the same numStr above. 

unsigned long long ullvalue = strtoull([numStr UTF8String], NULL, 0); 

Cela fait quelques hypothèses raisonnables, telles que numStr ne contiendra que des chiffres et il contient un « valide » à long valeur unsigned long. Un inconvénient de cette approche est que UTF8String crée ce qui revient essentiellement à [[numStr dataUsingEncoding:NSUTF8StringEncoding] bytes], ou en d'autres termes quelque chose dans le sens de 32 octets de mémoire libérée par appel. Pour la grande majorité des utilisations, ce n'est pas un problème quoi que ce soit.

Pour un exemple de la façon d'ajouter quelque chose comme unsignedLongLongValue-NSString qui est à la fois très rapide et utilise pas de mémoire autoreleased comme un effet secondaire, jetez un oeil à la fin de ma (longue) réponse à this SO question. Spécifiquement l'exemple d'implémentation de rklIntValue, qui nécessiterait seulement des modifications triviales pour implémenter unsignedLongLongValue. Les informations sur le strtoull peuvent être trouvées dans sa page man.

+1

Excellente réponse. Vous pouvez également simplement lire les caractères dans une chaîne C locale temporaire (puisque les caractères sont tous des chiffres, il n'y a pas de problèmes UTF-8 ou Unicode) et ensuite utiliser strtoull qui éviterait l'inconvénient décrit, mais ce serait très cas bizarre où votre inconvénient était un problème réel dans la pratique. –

+0

Il n'existe pas de méthode unsignedLongLongValue pour l'objet NSString – Gargo

+0

Pour demander la prise en charge de la lecture de valeurs non signées à partir de NSString, rendez-vous sur http://bugreport.apple.com et déposez une dupe de radar: // 2264733 contre le composant 'Foundation | X'. –

Questions connexes