Come stampare valori BigDecimal formattati?

Ho una amount campo BigDecimal che rappresenta denaro, e ho bisogno di stampare il suo valore nel browser in un formato come $123.00 , $15.50 , $0.33 .

Come lo posso fare?

(L’unica soluzione semplice che vedo io è ottenere floatValue da BigDecimal e quindi usare NumberFormat per fare precisione a due cifre per la parte frazione).

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

Utilizzerà le tue impostazioni internazionali per scegliere il tuo simbolo di valuta. Javadoc di NumberFormat

Per impostare il separatore delle migliaia, ad esempio 123,456.78 devi 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 

Anche se ho impostato la maschera #,###.00 , è riuscita a formattare anche i valori più lunghi. Nota che il separatore di virgola (,) nel risultato dipende dalla tua locale. Potrebbe essere solo lo spazio () per le impostazioni locali russe.

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

 BigDecimal newBD = oldBD.setScale(2); 

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

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

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

  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

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