web-dev-qa-db-fra.com

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

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

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 séparateur de regroupement "," qui fait en sorte que toutes mes valeurs apparaissent comme suit:

xxx,xxx

J'ai besoin que le séparateur soit un point ou un point et non une virgule. Quelqu'un sait-il comment accomplir ce petit exploit?

J'ai lu this et en particulier this à mort maintenant mais je ne peux pas trouver un moyen de faire cela. Est-ce que je l'aborde de la mauvaise façon? Y a-t-il une manière beaucoup plus élégante de faire ceci? Peut-être même une solution qui prend en compte différentes représentations de numéros locales, puisque la virgule serait parfaite par rapport aux normes européennes.

187
MiraFayless

Vous pouvez modifier le séparateur en définissant des paramètres régionaux ou en utilisant DecimalFormatSymbols .

Si vous voulez que le séparateur de groupement soit un point, vous pouvez utiliser une locale européenne:

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

Vous pouvez également utiliser la classe DecimalFormatSymbols pour modifier les symboles apparaissant dans les nombres mis en forme générés 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 de 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 (), à savoir:

Locale currentLocale = Locale.getDefault();
299
Chris

L'Europe est assez énorme. Je ne suis pas sûr qu'ils utilisent le même format partout. Cependant this ou this 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. utilisez les paramètres régionaux corrects.

13
Reno
public String getGermanCurrencyFormat(double value) {
    NumberFormat nf = NumberFormat.getNumberInstance(Locale.GERMAN);
    nf.setGroupingUsed(true);
    return "€ " + nf.format(value);
}
8
Imran Khan

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

Locale.getDefault(); //returns sl_SI

Les paramètres régionaux slovènes doivent comporter une virgule décimale. Je suppose que j'avais des idées fausses sur 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é que c'était dû à l'erreur humaine (j'ai oublié de valider des données et je cherchais la mauvaise chose).

Même chose que BigDecimal peut être dit 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.

Aussi, comme d'autres mentionnés en utilisant formateurs fonctionne bien. Il suffit d’utiliser des formateurs, comme pour l’interface JSF, les formateurs effectuent le travail correctement et connaissent les paramètres régionaux.

5
Neikius
String money = output.replace(',', '.');
3
Thakhani Tharage