231 votes

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

J'ai cette méthode un peu folle qui convertit les valeurs BigDecimal en chaînes de caractères 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 séparateur de groupe. "," qui fait que toutes mes valeurs sortent comme ça :

xxx,xxx

J'ai besoin que le séparateur soit un point ou une virgule et non une virgule. Quelqu'un a-t-il une idée de la manière de réaliser ce petit exploit ?

J'ai lu ce et en particulier ce à mort maintenant mais je ne trouve pas le moyen de le faire. Est-ce que je m'y prends 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 tienne compte des différentes représentations locales des nombres, puisque la virgule serait parfaite selon les normes européennes.

0 votes

0 votes

Changez la langue, ça a marché pour moi. stackoverflow.com/questions/4947484/

386voto

Chris Points 3196

Vous pouvez modifier le séparateur soit en définissant une locale, soit en utilisant la commande Symboles de formatage décimal .

Si vous souhaitez que le séparateur de groupe 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 qui apparaissent dans les nombres formatés produits par la méthode de formatage. Ces symboles comprennent, entre autres, le séparateur décimal, le séparateur de groupe, le signe moins et le signe pourcentage :

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();

1 votes

vous pouvez utiliser applyPattern sur le format décimal pour obtenir votre .00

1 votes

J'ai changé otherSymbols.setDecimalSeparator(',') ; en otherSymbols.setDecimalSeparator('.') ; Merci, cela fonctionne pour moi.

2 votes

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

16voto

Reno Points 22138

L'Europe est assez vaste. Je ne suis pas sûr qu'ils utilisent le même format partout. Cependant, ce ou ce La réponse vous 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 qu'il faut utiliser la bonne langue.

2 votes

En effet, monsieur ! Au Royaume-Uni, il faut voir "£1 234,00", alors qu'en France, on s'attend à "1 234,00€" (le séparateur de groupe, le séparateur décimal, le symbole de la monnaie et la position de la monnaie ont changé).

11voto

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

5voto

Neikius Points 31

BigDecimal ne semble pas respecter les paramètres de la Locale.

Locale.getDefault(); //returns sl_SI

La locale slovène devrait avoir une virgule décimale. Je suppose que j'avais d'étranges 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 puisqu'il s'est avéré qu'elle était due à une erreur humaine (j'ai oublié de valider les données et je regardais la mauvaise chose).

On peut dire la même chose de BigDecimal pour toutes les fonctions Java .toString(). Je suppose que c'est une bonne chose à certains égards. La sérialisation par exemple ou le débogage. Il existe une représentation unique de la chaîne de caractères.

Comme d'autres l'ont mentionné, l'utilisation de formateurs fonctionne bien. Utilisez simplement les formateurs, de même pour le frontal JSF, les formateurs font le travail correctement et sont conscients de la locale.

3voto

String money = output.replace(',', '.');

6 votes

Les numéros peuvent être au format arabe, et ils utilisent un autre séparateur : () (en hex U+066B). fr.wikipedia.org/wiki/Decimal_mark#Other_numeral_systems Les chiffres sont également différents : fr.wikipedia.org/wiki/Arabe_(Unicode_block)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X