Come stampare valori BigDecimal formattati?


104

Ho un BigDecimalcampo amountche rappresenta il denaro, e ho bisogno di stampare il suo valore nel browser in un formato simile $123.00, $15.50, $0.33.

Come lo posso fare?

(L'unica soluzione semplice, che mi vedo sta ottenendo floatValueda BigDecimale quindi utilizzando NumberFormatper fare la precisione a due cifre per la parte di frazione).

Risposte:


135
public static String currencyFormat(BigDecimal n) {
    return NumberFormat.getCurrencyInstance().format(n);
}

Utilizzerà l'impostazione predefinita corrente della JVM Localeper scegliere il simbolo della valuta. Oppure puoi specificare un file Locale.

NumberFormat.getInstance(Locale.US)

Per maggiori informazioni, vedi NumberFormatclass.


È possibile specificare un modello proprio come fa DecimalFormat?
Philippe Gioseffi

71

Per impostare migliaia di separatori, diciamo che 123,456.78devi usare DecimalFormat :

     DecimalFormat df = new DecimalFormat("#,###.00");
     System.out.println(df.format(new BigDecimal(123456.75)));
     System.out.println(df.format(new BigDecimal(123456.00)));
     System.out.println(df.format(new BigDecimal(123456123456.78)));

Ecco il risultato:

123,456.75
123,456.00
123,456,123,456.78

Sebbene abbia impostato la #,###.00maschera, formatta correttamente anche i valori più lunghi. Nota che il separatore virgola (,) nel risultato dipende dalla tua lingua. Potrebbe essere solo spazio () per la lingua russa.


19
Se preferisci che lo zero venga visualizzato come 0.00 (invece di .00), usa "#,##0.00"invece il pattern .
Jonik

35

Un altro modo che potrebbe avere senso per la situazione data è

BigDecimal newBD = oldBD.setScale(2);

Dico solo questo perché in alcuni casi quando si tratta di soldi che vanno oltre i 2 decimali non ha senso. Facendo un ulteriore passo avanti, questo potrebbe portare a

String displayString = oldBD.setScale(2).toPlainString();

ma volevo semplicemente evidenziare il metodo setScale (che può anche richiedere un secondo argomento della modalità di arrotondamento per controllare come viene gestita l'ultima cifra decimale. In alcune situazioni, Java ti obbliga a specificare questo metodo di arrotondamento).


14
 BigDecimal pi = new BigDecimal(3.14);
 BigDecimal pi4 = new BigDecimal(12.56);

 System.out.printf("%.2f",pi);

// stampa 3.14

System.out.printf("%.0f",pi4);

// stampa 13


6

Simile alla risposta di @Jeff_Alieffson, ma non basata sull'impostazione predefinita Locale :

Usa DecimalFormatSymbolsper impostazioni internazionali esplicite:

DecimalFormatSymbols decimalFormatSymbols  = DecimalFormatSymbols.getInstance(new Locale("ru", "RU"));

O simboli separatori espliciti:

DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
decimalFormatSymbols.setDecimalSeparator('.');
decimalFormatSymbols.setGroupingSeparator(' ');

Poi:

new DecimalFormat("#,##0.00", decimalFormatSymbols).format(new BigDecimal("12345"));

Risultato:

12 345.00

1
BigDecimal(19.0001).setScale(2, BigDecimal.RoundingMode.DOWN)

1
Dovrebbe essere BigDecimal (19.001) .setScale (2, BigDecimal.ROUND_HALF_UP) .toString ()
Jeff Tsay
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.