Come impostare il separatore delle migliaia in Java?


129

Come impostare il separatore delle migliaia in Java?
Ho una rappresentazione in formato stringa di un BigDecimal che desidero formattare con un separatore di migliaia e restituire come stringa.


stai ricevendo questi valori da DB?
Dead Programmer,

Risposte:


110

Dovrebbe funzionare (non testato, basato su JavaDoc):

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

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

Secondo JavaDoc, il cast nella prima riga dovrebbe essere salvato per la maggior parte delle versioni locali.


16
Commento Non testato su questo: Javadoc per getDecimalFormatSymbols()dice: Returns: a copy of the desired DecimalFormatSymbols. Quindi dovresti usarlo setDecimalFormatSymbols(theCopy)dopo aver modificato la copia.
java.is.for.desktop,

6
I documenti per bd.longValue () dicono che "qualsiasi parte frazionaria verrà scartata". Quindi non so se questo è il modo migliore per farlo se ti interessa la precisione
codinguser

2
Immagino che potresti usarlo newe riportarlo sul formatter: DecimalFormatSymbols customSymbol = new DecimalFormatSymbols(); customSymbol.setDecimalSeparator(decimalSeperator.charAt(0)); customSymbol.setGroupingSeparator(thousandSeperator); formatter.setDecimalFormatSymbols(customSymbol);
Lee Yi Hong

Penso che vorresti usare \ u00a0 (spazio non-breaking) come separatore di raggruppamento. È l'impostazione predefinita per alcune impostazioni locali.
ACV

3
Perché chiami longValue? La domanda era di impostare migliaia di operatori per BigDecimal, non molto tempo.
FINDarkside,

232

È possibile utilizzare la funzione di formattazione con ",";

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

//str = 124,750

"," include caratteri di raggruppamento specifici della locale.

docs


11
Cosa succede se desidero utilizzare a .come separatore?
Enissay,

Come di solito uso String.format è il migliore e più semplice per me!
Ali,

16
@Enissay Chiamare format()con un locale esplicito ( Local.USè noto per l'uso ,come separatore) e quindi sostituire ,con il separatore personalizzato: String.format(Locale.US, "%,d", n).replace(',', '.').
minipif,

java.util.IllegalFormatConversionException:% d non può formattare java.lang.String argomenti
Iman Marashi

1
@ImanMarashi Trasmettilo in un int. O a long. O a BigInteger. E usa f se vuoi usare double, floato BigDecimal.
Adowrath,

56
BigDecimal bd = new BigDecimal(300000);

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

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

MODIFICARE

Per ottenere un separatore di raggruppamento personalizzato come spazio, procedere come segue:

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

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

so che devo usare DecimalFormatSymbols setGroupingSeparator, ma non so come applicarlo sul mio BigDecimal
Funtime

1
@Funtime: non "applicarlo sul tuo BigDecimal". Costruisci un NumberFormatoggetto con le proprietà desiderate e lo usi per formattare il tuo BigDecimal. A BigDecimalha solo un valore specificato, non ha un formato specificato.
Joachim Sauer

1
Nota che il separatore delle migliaia è generalmente uno spazio non interrompibile (quando è uno spazio)
cquezel

Ho dovuto cambiare la riga superiore nella seconda opzione in DecimalFormatSymbols simboli = new DecimalFormatSymbols (); perché questo funzioni.
PaperThick,

14

prova questo codice per formattare come usato in Brasile:

    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
Anche tu provi questo, nel caso di JasperReports, forzando il formato corretto: parameters.put("REPORT_LOCALE", new Locale("pt", "BR")); invia questo parametro per segnalare.
dellasavia,

8

Se si utilizza il separatore delle migliaia per il tipo di dati Integer, utilizzare 1.

  1. Per tipo di dati intero

String.format ("%, d \ n", 58625) e l'output sarà 58.625

  1. Per i dati in virgola mobile digitare String.format ("% ,. 2f", 58625.21) e l'output sarà 58.625.21

Questa è stata un'epifania. Tuttavia, devi davvero sottolineare che "," è solo una bandiera, non il personaggio che usa come separatore di gruppo. (Mi ci è voluto un
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 risposta accettata deve essere davvero modificata altrimenti non funziona. Le getDecimalFormatSymbols rende una copia difensivo. Così,

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

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

La nuova linea è questa: formatter.setDecimalFormatSymbols (simboli);


2

Per i decimali :

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

Come accennato in precedenza, il seguente collegamento fornisce il codice paese specifico per consentire a Java di localizzare il numero. Ogni paese ha il suo stile.

Nel link sopra troverai il codice paese che dovrebbe essere inserito qui:

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

La Svizzera ad esempio formatta i numeri come segue:

1000,00 -> 1'000,00

prefisso internazionale

Per raggiungere questo obiettivo, i seguenti codici funzionano per me:

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

Il risultato è come previsto:

1'000.00

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

formatStr(2524.2) // 2,254.20



Mentre questo codice può fornire una soluzione alla domanda, è meglio aggiungere un contesto sul perché / come funziona. Questo può aiutare gli utenti futuri a imparare e applicare tali conoscenze al proprio codice. È inoltre probabile che tu riceva un feedback positivo dagli utenti sotto forma di valutazioni, quando viene spiegato il codice.
Borchvm,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.