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.

Funtime
la source
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.

Andreas Dolk
la source
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

syloc
la source
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()));
Adarshr
la source
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"
Dellasavia
la source
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.
Waqas Ahmed
la source
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);
Programmeur mort
la source
4
NumberFormat nf = DecimalFormat.getInstance(myLocale);
DecimalFormatSymbols customSymbol = new DecimalFormatSymbols();
customSymbol.setDecimalSeparator(',');
customSymbol.setGroupingSeparator(' ');
((DecimalFormat)nf).setDecimalFormatSymbols(customSymbol);
nf.setGroupingUsed(true);
Gab
la source
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);

Amio.io
la source
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));
Akelec
la source
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
0xjacobb
la source
1
public String formatStr(float val) {
 return String.format(Locale.CANADA, "%,.2f", val);
}

formatStr(2524.2) // 2,254.20


Kadir Erturk
la source
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