Come cambiare il separatore decimale di DecimalFormat da virgola a punto / punto?


204

Ho questo piccolo metodo pazzo che converte i valori BigDecimal in stringhe belle e leggibili.

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

Tuttavia, produce anche un cosiddetto separatore di raggruppamento ","che fa emergere tutti i miei valori in questo modo:

xxx,xxx

Ho bisogno che il separatore sia un punto o un punto e non una virgola. Qualcuno ha la minima idea di come realizzare questa piccola impresa?

Ho letto questo e in particolare questo fino alla morte ora, ma non riesco a trovare un modo per farlo. Mi sto avvicinando a questo nel modo sbagliato? C'è un modo molto più elegante per farlo? Forse anche una soluzione che rappresenta diverse rappresentazioni di numeri locali, poiché la virgola sarebbe perfetta per gli standard europei.


Risposte:


323

È possibile modificare il separatore impostando un'impostazione internazionale o utilizzando DecimalFormatSymbols .

Se vuoi che il separatore di raggruppamento sia un punto, puoi usare una locale europea:

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

In alternativa è possibile utilizzare la classe DecimalFormatSymbols per modificare i simboli che compaiono nei numeri formattati prodotti dal metodo format. Questi simboli includono il separatore decimale, il separatore di raggruppamento, il segno meno e il segno di percentuale, tra gli altri:

DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols(currentLocale);
otherSymbols.setDecimalSeparator(',');
otherSymbols.setGroupingSeparator('.'); 
DecimalFormat df = new DecimalFormat(formatString, otherSymbols);

currentLocale può essere ottenuto da Locale.getDefault () cioè:

Locale currentLocale = Locale.getDefault();

1
puoi usare applyPattern sul formato decimale per ottenere il tuo .00
krystan honour

Ho cambiato altriSymbols.setDecimalSeparator (','); as otherSymbols.setDecimalSeparator ('.'); Grazie. Funziona per me.
Aakanksha,

2
è come appare il formato, ad esempio String formatString = "#,###,###,##0.00";vedi docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html per la sintassi
Vulpo

1
"Puoi usare un locale europeo". Bene, non puoi usare nessun locale dall'Europa perché Locale.UKtornerà 1,567.90 e non 1.567,90
Junior Mayhé

Nota a margine: NumberFormat.getNumberInstance()può funzionare insolitamente lentamente su alcuni dispositivi Android 7. Un'alternativa è String.format()che funziona rapidamente. Vedi stackoverflow.com/questions/2379221/java-currency-number-format
Mr-IDE

14

L'Europa è piuttosto vasta. Non sono sicuro che utilizzino lo stesso formato dappertutto. Tuttavia questa o questa risposta sarà di aiuto.

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

Vale a dire usare le impostazioni internazionali corrette.


1
Davvero signore! Nel Regno Unito si vedono "£ 1.234,00", mentre in Francia sono previsti "1 234,00 €" (il separatore di gruppo, il separatore decimale, il simbolo di valuta e la posizione della valuta sono cambiati).
Vulpo,

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

5

BigDecimal non sembra rispettare le impostazioni internazionali.

Locale.getDefault(); //returns sl_SI

La locale slovena dovrebbe avere una virgola decimale. Suppongo di avere strane idee sbagliate riguardo ai numeri.

a = new BigDecimal("1,2") //throws exception
a = new BigDecimal("1.2") //is ok

a.toPlainString() // returns "1.2" always

Ho modificato una parte del mio messaggio che non ha senso dal momento che si è rivelato dovuto all'errore umano (ho dimenticato di salvare i dati e guardavo la cosa sbagliata).

Come per BigDecimal si può dire per qualsiasi funzione Java .toString (). Immagino che sia buono in qualche modo. Serializzazione per esempio o debug. Esiste una rappresentazione stringa unica.

Anche come altri menzionati usando i formattatori funziona bene. Basta usare i formattatori, lo stesso per il frontend JSF, i formattatori fanno il lavoro correttamente e sono a conoscenza delle impostazioni locali.


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.