2010-09-21 11 views
0

J'ai besoin de convertir NSString en double. Si cette chaîne est essentiellement un entier, alors le résultat est OK. Si la chaîne est décimale, peut-être aussi avec les séparateurs de groupe, alors les résultats sont faux. Tout roi de séparateur (que ce soit "." Ou ",") whis est premier dans la chaîne est toujours utilisé comme séparateur décimal.La méthode doubleValue de NSString donne des résultats inattendus

J'ai essayé de faire quelque chose avec NSScanner mais je ne comprends tout simplement pas comment résoudre ce problème.

L'idée est la suivante: que je mette un nombre entier de champs de texte, ou décimal avec ou sans séparateur de groupe, je veux obtenir le nombre décimal approprié.

Je serais extrêmement heureux d'obtenir de l'aide.

Merci d'avance!

+1

Publiez également du code à partir de ce que vous avez essayé jusqu'à présent. – JeremyP

Répondre

6

[string doubleValue] et un NSScanner normal utilise toujours le . comme séparateur décimal. Un NSScanner localisé utilise le séparateur décimal des paramètres régionaux en cours. Mais les deux ne savent rien sur le regroupement des personnages, ils sont donc inappropriés. Pour cela, vous devez utiliser NSNumberFormatter pour cela. Il est préférable de le configurer dans le constructeur d'interface comme l'a dit @Gobra. Mais vous pouvez aussi le faire dans le code comme ceci:

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setNumberStyle: NSNumberFormatterDecimalStyle]; 
double value = [[formatter numberFromString: string] doubleValue]; 

Si vous avez besoin de savoir wether la chaîne était valide ou non, vous pouvez vérifier si l'objet NSNumber retourné par numberFromString: est nil avant de l'envoyer le message doubleValue.

0

Étant donné que vous avez mentionné le champ de texte, je suppose que le problème consiste à lier une valeur numérique à NSTextField. La bonne manière ici est d'utiliser NSValueFormatter, il y a un formateur personnalisable pour les numériques dans la palette IB. Il suffit de le déposer sur le texte déposé et mettre en place les règles.

Même si la tâche n'a rien à voir avec l'interface utilisateur, vous pouvez toujours utiliser [NSValueTransformer valueTransformerForName: aName] pour créer une transformation et convertir la valeur avec.

+0

Je suppose que vous parlez de NSNumberFormatter? Je ne vois pas comment vous pouvez le "déposer sur le champ de texte" dans IB. – jv42

+0

Correct, il suffit de le faire glisser sur l'instance NSTextField, il devrait accepter la baisse. – Gobra