2009-08-26 7 views
1

lecture de la documentation, je dois faire quelque chose de laid comme ceci:Un moyen facile de nourrir dans un nombre décimal sous forme de chaîne dans un NSDecimalNumber?

NSLocale *usLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease]; 
NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:@"0.00001" locale:usLocale]; 

Mais: est-ce pas là une plus belle façon de dire que la classe NSDecimalNumber à regarder dehors pour la période au lieu de quoi que ce soit d'autre (.) ? Les locaux me semblent tellement dangereux. Et si un jour un nouveau président pense être si cool de changer le symbole de la période de . à ,? Ensuite, mon application se bloque. Bien sûr, cela n'arrivera pas si probable. Mais il y a une petite chance que cela puisse arriver. Assez pour me faire peur en utilisant une locale pour cela ;-)

Une idée? Ou est-ce ma seule option? Et si c'est la seule option: l'approche ci-dessus est-elle correcte? Ou y a-t-il même un meilleur? Et: Si je comprends bien, l'objet NSDecimalNumber lira cette chaîne, l'analysera et en créera les valeurs mantisse, exponent et isNegative pour usage interne, n'est-ce pas?

EDIT: J'aurais dû mentionner que j'ajoute ces valeurs par programmation/manuellement (dans mon code), ils ne sont pas une entrée utilisateur.

Répondre

1

Les paramètres régionaux sont une bonne chose; si le président devait changer la virgule décimale de . à ,, les paramètres régionaux en_US seraient mis à jour par la prochaine version du système d'exploitation - vous ne mentionnez pas explicitement le point décimal de l'environnement local dans le code ci-dessus, donc vous êtes OK . Cela étant dit, vous pourriez vouloir obtenir les paramètres régionaux du système au lieu de spécifier explicitement en_US, ce qui sera faux n'importe où en dehors des États-Unis.

Si la chaîne vous inquiète, elle devrait provenir d'un utilisateur, auquel cas elle utilisera sa virgule décimale locale, qui devrait correspondre. Si vous essayez d'initialiser un NSDecimalNumber de cette façon, je suppose que vous le pouvez, mais j'imagine qu'il existe des moyens plus faciles de peau ce chat.

Et oui, si vous l'obtenez à droite, le résultat sera un objet NSDecimalNumber dont la valeur est équivalente à la chaîne que vous avez passé dans.

2

Spécification des paramètres régionaux est nécessaire uniquement si vous passez dans une chaîne n'est pas un nombre décimal valide dans les paramètres régionaux par défaut. Si vos utilisateurs créent les chaînes, il est fort probable qu'elles les formateront correctement pour les paramètres régionaux utilisés.

L'utilisation des paramètres régionaux est beaucoup plus sûre que de ne pas les utiliser. Essayer d'analyser le "." sur "1,50" n'a pas de chances de réussir.

Et considérant que

[NSDecimalNumber decimalNumberWithString:@"0.00001" locale:usLocale] 

est décrit dans la documentation comme

Crée et retourne un objet NSDecimalNumber dont la valeur est équivalente à que dans une chaîne numérique.

Je pense qu'il est à parier qu'il crée et renvoie un NSDecimalNumber dont la valeur est équivalente à celle de la chaîne.

0

Les paramètres régionaux sont une bonne chose.Les paramètres régionaux modifiables appliqués aux données internes statiques sont une mauvaise chose, et vous avez raison (si paranoïaque peut-être: D) d'être préoccupé par l'application d'une locale aux données que vous (plutôt que l'utilisateur) fournit. Voici quelques solutions qui ne reposent pas sur l'application de paramètres régionaux à vos données internes.

number = [NSDecimalNumber decimalNumberWithMantissa:1 exponent:-5 isNegative:NO]; 
number = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithDouble:0.00001] decimalValue]; 

Le deuxième serait très facile de se transformer en une catégorie NSDecimalNumber mise en œuvre -decimalNumberWithDouble:. Probablement très utile.

+1

Cependant, vous allez vous exposer à des problèmes potentiels de représentation à virgule flottante dans la dernière implémentation, ce qui pourrait annuler les avantages de travailler avec NSDecimal ou NSDecimalNumber. –

+0

Oui, c'est vrai. C'est pourquoi je veux passer à cette technique d'entrée de chaîne. Quel dommage qu'ils n'aient pas donné l'option de spécifier le char pour le virgule flottante;) je vais m'en tenir à la chose locale de US_us. –

Questions connexes