2010-08-03 9 views
64

Ho un campo BigDecimalamount che rappresenta denaro e devo stampare il suo valore nel browser in un formato come $123.00, $15.50, $0.33.Come stampare valori BigDecimal formattati?

Come posso farlo?

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

risposta

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

utilizzerà le impostazioni internazionali per scegliere il simbolo della valuta. NumberFormat's javadoc

30

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 al di là di 2 cifre decimali non ha senso. Prendendo un passo ulteriore, questo potrebbe portare a

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

ma soltanto voluto evidenziare il metodo setScale (che può anche prendere un secondo argomento modalità di arrotondamento per controllare che l'ultima posizione decimale viene gestito. In alcune situazioni, Java ti obbliga a specificare questo metodo di arrotondamento).

26

Per impostare separatore delle migliaia, dire 123,456.78 è necessario utilizzare 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 #,###.00 maschera, si formatta con successo i valori più lunghi anche. Nota che il separatore di virgola (,) nel risultato dipende dalla tua locale. Potrebbe essere solo lo spazio() per le impostazioni locali russe.

+11

Se si preferisce lo zero da visualizzare come 0.00 (invece di 0,00), utilizzare il modello '" # , ## 0.00 "invece. – Jonik

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

Dovrebbe essere BigDecimal (19.001) .setScale (2, BigDecimal.ROUND_HALF_UP) .toString() –

3
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