Comment définir le séparateur de milliers en Java?


129

Comment définir le séparateur de milliers en Java?
J'ai une représentation String d'un BigDecimal que je souhaite formater avec un séparateur de milliers et retourner sous forme de chaîne.


obtenez-vous ces valeurs de DB?
Dead Programmer

Réponses:


110

Cela devrait fonctionner (non testé, basé sur JavaDoc):

DecimalFormat formatter = (DecimalFormat) NumberFormat.getInstance(Locale.US);
DecimalFormatSymbols symbols = formatter.getDecimalFormatSymbols();

symbols.setGroupingSeparator(' ');
formatter.setDecimalFormatSymbols(symbols);
System.out.println(formatter.format(bd.longValue()));

Selon JavaDoc, le cast de la première ligne doit être enregistré pour la plupart des paramètres régionaux.


16
Commentaire inexploré ceci: Javadoc getDecimalFormatSymbols()dit: Returns: a copy of the desired DecimalFormatSymbols. Vous devriez donc utiliser setDecimalFormatSymbols(theCopy)après avoir modifié la copie.
java.is.for.desktop

6
La documentation pour bd.longValue () dit "toute partie fractionnaire sera supprimée". Donc, je ne sais pas si c'est la meilleure façon de faire cela si vous vous souciez de la précision
codinguser

2
Je suppose que vous pouvez l'utiliser newet le remettre au formateur: DecimalFormatSymbols customSymbol = new DecimalFormatSymbols(); customSymbol.setDecimalSeparator(decimalSeperator.charAt(0)); customSymbol.setGroupingSeparator(thousandSeperator); formatter.setDecimalFormatSymbols(customSymbol);
Lee Yi Hong

Je pense que vous voudriez utiliser \ u00a0 (espace insécable) comme séparateur de groupe. C'est la valeur par défaut pour certains paramètres régionaux.
ACV

3
Pourquoi appelez-vous longValue? La question était de définir l'opérateur des milliers pour BigDecimal, pas longtemps.
FINDarkside

232

Vous pouvez utiliser la fonction de formatage avec ",";

int no = 124750;
String str = String.format("%,d", no);

//str = 124,750

"," inclut des caractères de regroupement spécifiques aux paramètres régionaux.

docs


11
Et si je veux utiliser un .comme séparateur?
Enissay le

Comme j'utilise habituellement String.format, c'est le meilleur et le plus simple pour moi!
Ali

16
@Enissay Appelez format()avec une locale explicite ( Local.USest connu d'utiliser ,comme séparateur) puis remplacez ,votre séparateur personnalisé: String.format(Locale.US, "%,d", n).replace(',', '.').
minipif

java.util.IllegalFormatConversionException:% d ne peut pas formater les arguments java.lang.String
Iman Marashi

1
@ImanMarashi Lancez-le sur un fichier int. Ou un long. Ou un BigInteger. Et utilisez f si vous souhaitez utiliser double, floatou BigDecimal.
Adowrath

56
BigDecimal bd = new BigDecimal(300000);

NumberFormat formatter = NumberFormat.getInstance(new Locale("en_US"));

System.out.println(formatter.format(bd.longValue()));

ÉDITER

Pour obtenir un séparateur de regroupement personnalisé tel que l'espace, procédez comme suit:

DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance();
symbols.setGroupingSeparator(' ');

DecimalFormat formatter = new DecimalFormat("###,###.##", symbols);
System.out.println(formatter.format(bd.longValue()));

Je sais que j'ai besoin d'utiliser DecimalFormatSymbols setGroupingSeparator, mais je ne sais pas comment l'appliquer sur mon BigDecimal
Funtime

1
@Funtime: vous ne "l'appliquez pas sur votre BigDecimal". Vous créez un NumberFormatobjet avec les propriétés souhaitées et vous l'utilisez pour formater votre fichier BigDecimal. A BigDecimaln'a qu'une valeur spécifiée, il n'a pas de format spécifié.
Joachim Sauer

1
Notez que le séparateur des milliers est généralement un espace insécable (quand il s'agit d'un espace)
cquezel

Dû changer la ligne du haut dans la 2ème option en symboles DecimalFormatSymbols = new DecimalFormatSymbols (); pour que cela fonctionne.
PaperThick

14

essayez ce code pour formater comme utilisé au Brésil:

    DecimalFormat df = new DecimalFormat(
      "#,##0.00", 
      new DecimalFormatSymbols(new Locale("pt", "BR")));

    BigDecimal value = new BigDecimal(123456.00);

    System.out.println(df.format(value.floatValue()));

    // results: "123.456,00"

2
Vous aussi essayez ceci, dans le cas de JasperReports, en forçant le format correct: parameters.put("REPORT_LOCALE", new Locale("pt", "BR")); Envoyez ce paramètre au rapport.
dellasavia

8

Si vous utilisez un séparateur de milliers pour le type de données Integer, utilisez 1.

  1. Pour le type de données entier

String.format ("%, d \ n", 58625) et la sortie sera 58 625

  1. Pour les données à virgule flottante, tapez String.format ("% ,. 2f", 58625.21) et la sortie sera 58 625,21.

C'était une révélation. Cependant, vous devez vraiment souligner que "," n'est qu'un indicateur, pas le caractère qu'il utilise comme séparateur de groupe. (Il m'a fallu du
Vankog

5
DecimalFormatSymbols formatSymbols = new DecimalFormatSymbols();
formatSymbols.setDecimalSeparator('|');
formatSymbols.setGroupingSeparator(' ');

String strange = "#,##0.###";
DecimalFormat df = new DecimalFormat(strange, formatSymbols);
df.setGroupingSize(4);

String out = df.format(new BigDecimal(300000).doubleValue());

System.out.println(out);

4
NumberFormat nf = DecimalFormat.getInstance(myLocale);
DecimalFormatSymbols customSymbol = new DecimalFormatSymbols();
customSymbol.setDecimalSeparator(',');
customSymbol.setGroupingSeparator(' ');
((DecimalFormat)nf).setDecimalFormatSymbols(customSymbol);
nf.setGroupingUsed(true);

3

La réponse acceptée doit être vraiment modifiée sinon ne fonctionne pas. Le getDecimalFormatSymbols fait une copie défensive. Donc,

DecimalFormat formatter = (DecimalFormat) NumberFormat.getInstance(Locale.US);
DecimalFormatSymbols symbols = formatter.getDecimalFormatSymbols();

symbols.setGroupingSeparator(' ');
formatter.setDecimalFormatSymbols(symbols);
System.out.println(formatter.format(bd.longValue()));

La nouvelle ligne est celle-ci: formatter.setDecimalFormatSymbols (symboles);


2

Pour les décimales :

DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setGroupingSeparator(' ');
DecimalFormat dfDecimal = new DecimalFormat("###########0.00###");
dfDecimal.setDecimalFormatSymbols(symbols);
dfDecimal.setGroupingSize(3);
dfDecimal.setGroupingUsed(true);
System.out.println(dfDecimal.format(number));

1

Comme mentionné ci-dessus, le lien suivant vous donne le code de pays spécifique pour permettre à Java de localiser le numéro. Chaque pays a son propre style.

Dans le lien ci-dessus, vous trouverez le code du pays qui doit être placé ici:

...(new Locale(<COUNTRY CODE HERE>));

La Suisse, par exemple, formate les nombres comme suit:

1 000,00 -> 1 000,00

code postal

Pour y parvenir, les codes suivants fonctionnent pour moi:

NumberFormat nf = NumberFormat.getNumberInstance(new Locale("de","CH"));
nf.setMaximumFractionDigits(2);
DecimalFormat df = (DecimalFormat)nf;
System.out.println(df.format(1000.00));

Le résultat est comme prévu:

1'000.00

1
public String formatStr(float val) {
 return String.format(Locale.CANADA, "%,.2f", val);
}

formatStr(2524.2) // 2,254.20



Bien que ce code puisse fournir une solution à la question, il est préférable d'ajouter un contexte expliquant pourquoi / comment cela fonctionne. Cela peut aider les futurs utilisateurs à apprendre et à appliquer ces connaissances à leur propre code. Vous êtes également susceptible d'avoir des commentaires positifs des utilisateurs sous la forme de votes positifs, lorsque le code est expliqué.
borchvm
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.