Comment changer le séparateur décimal de DecimalFormat de virgule en point / point?

204

J'ai cette petite méthode folle qui convertit les valeurs BigDecimal en chaînes agréables et lisibles.

private String formatBigDecimal(BigDecimal bd){
    DecimalFormat df = new DecimalFormat();
    df.setMinimumFractionDigits(3);
    df.setMaximumFractionDigits(3);
    df.setMinimumIntegerDigits(1);
    df.setMaximumIntegerDigits(3);
    df.setGroupingSize(20);
    return df.format(bd);
}

Cependant, il produit également un soi-disant séparateur de regroupement ","qui fait sortir toutes mes valeurs comme ceci:

xxx,xxx

J'ai besoin que le séparateur soit un point ou un point et non une virgule. Quelqu'un a une idée de la façon d'accomplir ce petit exploit?

J'ai lu ceci et en particulier ceci à mort maintenant mais je ne peux pas trouver une manière de faire ceci. Suis-je en train de l'aborder de la mauvaise façon? Existe-t-il une manière beaucoup plus élégante de procéder? Peut-être même une solution qui prend en compte différentes représentations de nombres locaux, car la virgule serait parfaite selon les normes européennes.

MiraFayless
la source

Réponses:

323

Vous pouvez modifier le séparateur en définissant un paramètre régional ou en utilisant DecimalFormatSymbols .

Si vous souhaitez que le séparateur de regroupement soit un point, vous pouvez utiliser un paramètre régional européen:

NumberFormat nf = NumberFormat.getNumberInstance(Locale.GERMAN);
DecimalFormat df = (DecimalFormat)nf;

Vous pouvez également utiliser la classe DecimalFormatSymbols pour modifier les symboles qui apparaissent dans les nombres formatés produits par la méthode de formatage. Ces symboles incluent le séparateur décimal, le séparateur de regroupement, le signe moins et le signe pourcentage, entre autres:

DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols(currentLocale);
otherSymbols.setDecimalSeparator(',');
otherSymbols.setGroupingSeparator('.'); 
DecimalFormat df = new DecimalFormat(formatString, otherSymbols);

currentLocale peut être obtenu à partir de Locale.getDefault (), c'est-à-dire:

Locale currentLocale = Locale.getDefault();
Chris
la source
1
vous pouvez utiliser applyPattern au format décimal pour obtenir votre .00
krystan honor
J'ai changé otherSymbols.setDecimalSeparator (','); as otherSymbols.setDecimalSeparator ('.'); Merci. Cela fonctionne pour moi.
Aakanksha
2
c'est à quoi ressemble le format, par exemple String formatString = "#,###,###,##0.00";voir docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html pour la syntaxe
Vulpo
1
"Vous pouvez utiliser un environnement local européen". Eh bien, vous ne pouvez pas utiliser de paramètres régionaux d'Europe, car Locale.UKils reviendront 1,567.90 et non 1.567,90
Junior Mayhé
Remarque: NumberFormat.getNumberInstance()peut fonctionner de manière inhabituellement lente sur certains appareils Android 7. Une alternative est celle String.format()qui fonctionne rapidement. Voir stackoverflow.com/questions/2379221/java-currency-number-format
Mr-IDE
14

L'Europe est assez vaste. Je ne sais pas s'ils utilisent partout le même format. Cependant, telle ou telle réponse sera utile.

String text = "1,234567";
NumberFormat nf_in = NumberFormat.getNumberInstance(Locale.GERMANY);
double val = nf_in.parse(text).doubleValue();

NumberFormat nf_out = NumberFormat.getNumberInstance(Locale.UK);
nf_out.setMaximumFractionDigits(3);
String output = nf_out.format(val);

C'est à dire utiliser les paramètres régionaux corrects.

Reno
la source
1
En effet monsieur! Au Royaume-Uni, "1 234,00 £" est à voir, tandis qu'en France "1 234,00 €" est prévu (séparateur de groupe, séparateur décimal, symbole monétaire et position de la monnaie ont changé).
Vulpo
9
public String getGermanCurrencyFormat(double value) {
    NumberFormat nf = NumberFormat.getNumberInstance(Locale.GERMAN);
    nf.setGroupingUsed(true);
    return "€ " + nf.format(value);
}
Imran Khan
la source
5

BigDecimal ne semble pas respecter les paramètres régionaux.

Locale.getDefault(); //returns sl_SI

Les paramètres régionaux slovènes doivent avoir une virgule décimale. Je suppose que j'avais des idées fausses étranges concernant les chiffres.

a = new BigDecimal("1,2") //throws exception
a = new BigDecimal("1.2") //is ok

a.toPlainString() // returns "1.2" always

J'ai édité une partie de mon message qui n'avait aucun sens car il s'est avéré être dû à l'erreur humaine (j'ai oublié de valider les données et je cherchais la mauvaise chose).

Identique à BigDecimal pour toutes les fonctions Java .toString (). Je suppose que c'est bon à certains égards. Sérialisation par exemple ou débogage. Il existe une représentation de chaîne unique.

De plus, comme d'autres l'ont mentionné, l'utilisation de formateurs fonctionne bien. Utilisez simplement des formateurs, de même pour le frontend JSF, les formateurs font le travail correctement et connaissent les paramètres régionaux.

Neikius
la source