Point de force (".") Comme séparateur décimal en java

103

J'utilise actuellement le code suivant pour imprimer un double:

return String.format("%.2f", someDouble);

Cela fonctionne bien, sauf que Java utilise le séparateur décimal de mes paramètres régionaux (une virgule) alors que je voudrais utiliser un point. Y a-t-il un moyen facile de faire ceci?

dtech
la source
Si vous avez besoin d'utiliser la valeur double avec des décimales précises, vous devriez peut-être utiliser BigDecimal au lieu de double / Double. Consultez ce lien pour connaître les problèmes que vous pouvez rencontrer lors de l'utilisation de variables doubles. Vous pouvez également essayer ceci: System.out.println (5.1d + 1.1d); - le résultat sera 6,199999999999999 au lieu de 6,2. Je pense que quelqu'un qui cherche comment formater des nombres avec des décimales comme String doit ignorer les variables doubles.
razvanone

Réponses:

172

Utilisez la surcharge String.formatqui vous permet de spécifier les paramètres régionaux:

return String.format(Locale.ROOT, "%.2f", someDouble);

Si vous ne formatez qu'un nombre - comme vous le faites ici - alors l'utilisation NumberFormatserait probablement plus appropriée. Mais si vous avez besoin du reste des capacités de formatage de String.format, cela devrait fonctionner correctement.

Jon Skeet
la source
6
Locale.ROOT est plus neutre.
speedogoo
@speedogoo: Édité, même si je soupçonne que pour le formatage des nombres, cela ne fait aucune différence.
Jon Skeet
1
Ouais, mais vous n'avez pas besoin de choisir entre les États-Unis et le Royaume-Uni. 😜
speedogoo
2
Locale.ROOT est également sûr contre d'éventuels changements futurs dans le choix du séparateur décimal d'un pays.
Attila Tanyi
IMO cela ne répond pas à la question, plutôt le Locale.setDefault (new Locale ("en", "US")); fait comme indiqué dans une autre réponse. Il est vrai que cela a peut-être des effets secondaires indésirables car il est global, OTH en tant que programmeur, ce que je veux vraiment, c'est que la valeur par défaut globale soit US parce que partout ailleurs dans mon code où je me soucie des paramètres régionaux, je le fais explicitement.
nyholku
21

Une solution plus radicale consiste à définir vos paramètres régionaux au début de main ().

Comme:

Locale.setDefault(new Locale("en", "US"));
Federico Giorgi
la source
11
C'est une réponse très problématique, car elle a un effet global et peut donc entraîner de nombreux autres changements (éventuellement indésirables).
sleske
2
IMO c'est la bonne réponse à la question et à côté en tant que programmeur c'est ce que je veux. Je veux que Java utilise les paramètres régionaux américains par défaut, car partout dans mon code où j'ai réellement besoin d'une localisation, je le rendrai explicite dans mon code. Juste mes habitudes peut-être, mais c'est très ennuyeux quand printf / format utilise mes locales car la virgule décimale est totalement incompatible avec les autres logiciels (Matlab n'importe qui) que j'utilise.
nyholku
10

Vous pouvez passer un Locale supplémentaire à java.lang.String.format ainsi qu'à java.io.PrintStream.printf (par exemple System.out.printf ()):

import java.util.Locale;

public class PrintfLocales {

    public static void main(String args[]) {
        System.out.printf("%.2f: Default locale\n", 3.1415926535);
        System.out.printf(Locale.GERMANY, "%.2f: Germany locale\n", 3.1415926535);
        System.out.printf(Locale.US, "%.2f: US locale\n", 3.1415926535);
    }

}

Il en résulte ce qui suit (sur mon PC):

$ java PrintfLocales
3.14: Default locale
3,14: Germany locale
3.14: US locale

Voir String.format dans l'API Java.

Simon A. Eugster
la source
4
Vous pouvez également utiliser out.printf((Locale)null, ...)ou out.format((Locale)null, ...)pour obtenir une représentation locale indépendante. (et il y a aussi Locale.ROOT)
eckes
10

Bien trop tard, mais comme d'autres l'ont mentionné, voici un exemple d'utilisation de NumberFormat(et de sa sous-classe DecimalFormat)

public static String format(double num) {
    DecimalFormatSymbols decimalSymbols = DecimalFormatSymbols.getInstance();
    decimalSymbols.setDecimalSeparator('.');
    return new DecimalFormat("0.00", decimalSymbols).format(num);
 }
VizGhar
la source
J'ai le sentiment que la création DecimalFormatSymbolset le réglage du séparateur doivent être effectués une fois, avant cette méthode.
Ligne
0

Vous pouvez utiliser NumberFormat et DecimalFormat.

Jetez un œil à ce lien à partir de Tutoriels Java Formatage local

La section intitulée Formatage sensible aux paramètres régionaux est ce dont vous avez besoin.

blong824
la source
-3

J'ai eu le même problème ... 55.1transformé en 55,10. Ma solution rapide (sale?) Est:

String.format("%.2f", value).replaceAll(",",".");

fred '
la source
1
Cela ne fonctionne que jusqu'à ce que quelqu'un essaie d'exécuter votre code dans une langue différente. Pas une vraie solution. -1
Marco Freudenberger