2012-05-02 16 views
14

Come è possibile utilizzare NumberFormat per formattare un valore double per un dato Locale (le impostazioni locali predefinite sono sufficienti) e per un dato numero di posizioni decimali?Come formattare il doppio valore per una determinata località e il numero di cifre decimali?

Per esempio, ho questi valori:

double d1 = 123456.78; 
double d2 = 567890; 

e voglio stamparle nel seguente modo, per esempio con gli Stati Uniti localizzazione e 2 decimali:

123,456.78 
567,890.00 

I don' In questo caso, in realtà si preoccupa della modalità arrotondamento, perché questi valori doppi vengono acquisiti da un valore BigDecimal con la scala specificata, quindi il loro numero di cifre decimali è sempre minore o uguale al numero di cifre decimali che si desidera stampare.

Edit:

per rendere le cose un po 'più chiaro, la cosa è che voglio per visualizzare soldi in un modo dipendente dalla localizzazione, ma con un numero fisso di cifre decimali. L'esempio precedente mostrava come i valori dovrebbero essere formattati se le impostazioni internazionali del sistema sono en_US. Ora consente di dire, la lingua del sistema è cs_CZ (Repubblica), quindi gli stessi numeri deve essere formattato in questo modo:

123 456,78 
567 890,00 

Ora, come posso impostare un NumberFormat per visualizzare sempre 2 cifre decimali, ma per visualizzare separatore di migliaia e punto decimale in base alla locale corrente?

risposta

36

Se si cura di leggere la documentazione di NumberFormat, la soluzione sarebbe ovvia:

double d1 = 123456.78; 
double d2 = 567890; 
// self commenting issue, the code is easier to understand 
Locale fmtLocale = Locale.getDefault(Category.FORMAT); 
NumberFormat formatter = NumberFormat.getInstance(fmtLocale); 
formatter.setMaximumFractionDigits(2); 
formatter.setMinimumFractionDigits(2); 
System.out.println(formatter.format(d1)); 
System.out.println(formatter.format(d2)); 
System.out.println(fmtLocale.toLanguageTag()); 

Sulla mia macchina Questo stampa:

123 456,78
567 890,00
pl-PL

Credo che questo sia quello che stai cercando, un d non devi fare confusione con i pattern. Non lo farei - per esempio ci sono locali che raggruppano le cifre per due, non per tre (questo è il motivo per cui parliamo del separatore e nonseparatore di migliaia).

+0

Grazie mille – Sayka

+0

@ Paweł Dyda Come devo convertire una stringa 123,456.78 in locale degli Stati Uniti per un valore doppio 123.456,78? – KJEjava48

3

Si potrebbe usare qualcosa come

DecimalFormat formatter = (DecimalFormat) DecimalFormat.getInstance(); 
formatter.applyPattern("#,###,##0.00"); 
formatter.format(yourDoubleHere) 
7

Adattato da Customizing Formats,

public void localizedFormat(double value,Locale loc) { 

    NumberFormat nf = NumberFormat.getNumberInstance(loc); 
    DecimalFormat df = (DecimalFormat)nf; 
    df.applyPattern("###,###.00"); 
    String output = df.format(value); 

    } 

Questa funzione dovrebbe darvi la formattazione desiderata.

0

converte un valore doppio in un valore doppio con qualsiasi numero di cifre dopo il decimale. Ho creato questo metodo in una classe di utilità per accedervi attraverso il progetto.

public static double convertToDecimal(double doubleValue, int numOfDecimals) { 
     BigDecimal bd = new BigDecimal(doubleValue); 
     bd = bd.setScale(numOfDecimals, BigDecimal.ROUND_HALF_UP); 
     return bd.doubleValue(); 
    } 
Problemi correlati