À l'aide de NSNumberFormatter pour obtenir une valeur décimale à partir d'une monnaie internationale de la chaîne
Il semble que la NSNumberFormatter peut pas analyser Euro (et probablement d'autres) des chaînes de devise dans un type numérique. Quelqu'un peut-il svp me prouver le contraire.
Je suis d'essayer d'utiliser les éléments suivants pour obtenir un chiffre montant à partir d'une chaîne de devise:
NSNumberFormatter *currencyFormatter = [[[NSNumberFormatter alloc] init] autorelease];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
NSNumber *currencyNumber = [currencyFormatter numberFromString:currencyString];
Cela fonctionne bien pour le royaume-UNI et NOUS les montants en devise. Il en vient même à des $ et £ et les séparateurs de milliers, sans aucun problème.
Cependant, lorsque je l'utilise avec l'euro, les montants en devise (avec la Région, le formatage de la France ou de l'Allemagne dans l'application des paramètres), il retourne une chaîne vide. Toutes les chaînes de caractères suivantes échouent:
12,34 €
12,34
12.345,67 €
12.345,67
Il est intéressant de noter que ces chaînes qui correspondent exactement à ce qui vient de la NSNumberFormatter de stringFromNumber méthode lors de l'utilisation de la correspondante locale.
Réglage de la Région de Format pour la France dans l'application réglages, puis en définissant currencyNumber à 12.34 dans le code suivant, les résultats de currencyString être réglé à " 12,34 €' :
NSNumberFormatter *currencyFormatter = [[[NSNumberFormatter alloc] init] autorelease];
[currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
NSString *currencyString = [currencyFormatter stringFromNumber:currencyNumber];
Il serait évidemment assez facile de pirater autour de ce problème spécifiquement pour l'Euro, mais je suis l'espoir de vendre cette application dans autant de pays que possible, et je suis en train de penser qu'une situation similaire s'est lié à se produire avec d'autres localités.
Quelqu'un aurait-il une réponse?
TIA, Duncan
- Je n'ai pas trouvé une solution à ce pourtant si aucune entrée ne sera plus qu'appréciée. Merci, Duncan
- Je vous suggère de déposer un rapport de bogue.
Vous devez vous connecter pour publier un commentaire.
C'est une question difficile. Procédant de la manière suivante fonctionne sans problèmes:
Cependant, la sortie de la
-currencyGroupingSeparator
méthode renvoie la chaîne\u00a0
, un l'espace insécable, plutôt que de l'attendre,
.Le module de formatage des classes (ainsi que la regex classes, entre autres) sur OS X /iOS faire usage de la ICU bibliothèque, également utilisé par d'autres projets. J'ai trouvé au moins deux autres bug rapports en ce qui concerne cette question en particulier. Il semble que c'est attendu comportement, cependant. (J'ai passé quelques temps à ressasser l'unité de soins intensifs source pour trouver où cela est défini, mais il s'agit d'un labyrinthe.)
Ma recommandation, pour le moment, serait de passer
-setLenient:YES
de la monnaie formateur. Peut-être même faire un rapport de bogue avec Apple radar.setLenient:
est de l'or.Avez-vous essayé le réglage de la région en France dans les paramètres, puis tentez d'obtenir le numérique le montant de la chaîne? Ou vous pouvez définir manuellement les locaux du numéro de formateur avec
setLocale:
. NSNumberFormatter utilise quelle que soit locale, il doit comprendre ce que le nombre est une chaîne sont. Si vous avez besoin de l'utilisateur d'être en mesure de mettre dans une devise localisée chaîne pour leur région, de changer le système pour que les paramètres régionaux, puis test. Si vous avez besoin de l'utilisateur d'être en mesure de mettre dans de multiples formats, puis ajouter une sorte de système de sélection de sorte que vous savez ce qu'ils sont en train de mettre en.J'ai vérifié que (au moins sur iOS 4.3) à l'aide de la [formateur setLenient:OUI] drapeau a fonctionné pour moi à l'aide d'Euros. Sans que l'indicateur est défini, le formateur ne retourne pas de valeurs correctes pour des Euros.
Son travail code Swift..
Identifiants:
"de_DE"
"en_US"
"fr_FR"
La valeur mise en forme serait également retourné avec le symbole de la monnaie.
J'ai une vilaine réponse à l'aide de
NSScanner
de sortie:
2011-05-05 12:56:25.460 ScannerTest[10882:903] la sortie du flotteur est 12.34
2011-05-05 12:56:25.473 ScannerTest[10882:903] la sortie du flotteur est 12.34
2011-05-05 12:56:25.474 ScannerTest[10882:903] la sortie du flotteur est 12345.67
2011-05-05 12:56:25.475 ScannerTest[10882:903] la sortie du flotteur est 12345.67
Avec les paramètres par défaut (
lenient
= NON), il sera seulement convertir des chaînes en nombres si ils sont mis en forme exactement comme les chaînes qu'il produit lors de la mise en forme de nombres en chaînes.Donc, dans le cas où vous souhaitez utiliser la non-clément conversions, vous devez être conscient que, dans de nombreux endroits (tous?) cela signifie que les espaces dans la chaîne d'entrée doit être de non-rupture (
\u00a0
). À savoir:Ce ne sera pas produire les résultats escomptés, comme le
number
variable sera nul. Pour obtenir le résultat souhaité, utiliser des espaces insécables dans les deux endroits de la chaîne (comme un séparateur de milliers et un symbole de devise séparateur):Puis la conversion va se passer comme prévu.
Bien sûr, si vous souhaitez utiliser clémente conversions, alors que c'est le moyen le plus facile pour y aller, et il sera probablement la meilleure option pour la gestion humaine d'entrée.
D'autre part, lors de la manipulation de la machine les données générées, une indulgence de l'interprétation des chaînes de caractères peuvent ne pas être souhaitable, car vous allez perdre la capacité de contrôler l'exactitude des données d'entrée.
Le moyen de le faire dans Swift:
En supposant que le champ de texte.le texte est le numéro saisi.