web-dev-qa-db-fra.com

Comment convertir une chaîne en double en Java en utilisant des paramètres régionaux spécifiques?

Je souhaite convertir des nombres que j'ai obtenus sous forme de chaînes en doubles, mais ces chiffres ne sont pas dans la langue standard des États-Unis, mais dans une autre. Comment puis je faire ça?

35
Daniel C. Sobral

Essayez Java.text.NumberFormat . Des Javadocs:

Pour formater un numéro pour un autre paramètre régional, spécifiez-le dans l'appel à getInstance. 

NumberFormat nf = NumberFormat.getInstance(Locale.FRENCH);

Vous pouvez également utiliser un NumberFormat pour analyser les numéros: 

myNumber = nf.parse(myString);

parse() retourne un Number ; donc pour obtenir une double, vous devez appeler myNumber.doubleValue() :

    double myNumber = nf.parse(myString).doubleValue();

Notez que parse() ne retournera jamais null, donc cela ne peut pas causer une NullPointerException. Au lieu de cela, parse lève une case à cocher ParseException si elle échoue.

Edit: Au départ, j'avais dit qu'il y avait un autre moyen de convertir en double: transtyper le résultat en Double et d'utiliser unboxing. Je pensais que dans la mesure où une instance à usage général de NumberFormat était utilisée (conformément aux Javadocs de getInstance ), elle renverrait toujours une Double. Mais DJClayworth indique que les Javadocs pour parse(String, ParsePosition) (appelé par parse(String)) indiquent qu’un Long est retourné si possible. Par conséquent, attribuer le résultat à Double est dangereux et ne doit pas être essayé!
Merci, DJClayworth!

61
Michael Myers

NumberFormat est la voie à suivre, mais vous devez être conscient de ses particularités qui apparaissent lorsque vos données sont correctes à moins de 100%.

J'ai trouvé ce qui suit utile:

http://www.ibm.com/developerworks/Java/library/j-numberformat/index.html

Si vous pouvez faire confiance à votre contribution, vous n'avez pas à vous en préoccuper.

5
Jasper Floor

Vous utilisez un NumberFormat. Ici est un exemple, qui, je pense, semble correct.

3
unwind

Juste apprendre Java et la programmation. A eu une question similaire. J'ai trouvé quelque chose comme ça dans mon manuel:

Scanner sc = new Scanner(string);
double number = sc.nextDouble();

Le livre indique qu'un scanner décode automatiquement le contenu d'une variable variable String et que la classe Scanner s'adapte automatiquement à la langue des paramètres régionaux définis, les paramètres régionaux du système étant les paramètres par défaut, mais il est facile de définir un autre paramètre.

J'ai résolu mon problème de cette façon. Peut-être que cela pourrait fonctionner pour le problème ci-dessus au lieu de l'analyse syntaxique?

Ajout: La raison pour laquelle j’ai aimé cette méthode est le fait que lorsqu’on a utilisé des boîtes de dialonges balancés pour l’entrée, puis que l’on a essayé de convertir la chaîne en double avec l’analyse syntaxique, j’ai eu une exception NumberFormatException. Il s’est avéré que l’analyse utilise exclusivement le formatage américain, tandis que Scanner peut gérer tous les formats. Scanner a parfaitement fonctionné la saisie, même avec le séparateur décimal par virgule (,). Puisque la réponse la plus votée utilise parse, je ne vois vraiment pas comment cela résoudrait ce problème particulier. Vous devez entrer vos numéros au format américain, puis les convertir au format de votre pays. C'est plutôt gênant lorsque votre clavier numérique est muni d'une virgule.

Maintenant, vous êtes tous libres de me mettre en pièces;)

3
lytwaytLaz

Cela ne devrait pas poser de problème avec Java.text.DecimalFormat.

1
Roland Ewald

Utilisez NumberFormat.getNumberInstance (Paramètres régionaux)

1
adrian.tarau

Savez-vous de quel lieu il s'agit? Ensuite, vous pouvez utiliser

DecimalFormat format = DecimalFormat.getInstance(theLocale);
format.parse(yourString);

cela fonctionnera même pour les notations scientifiques, les chaînes avec des signes de pourcentage ou les chaînes avec des symboles monétaires.

0
Fortega