2012-05-02 5 views
14

Wie kann ich NumberFormat verwenden, um einen double Wert für eine gegebene Locale (Standardgebietsschema ist ausreichend) und für eine gegebene Anzahl von Dezimalstellen zu formatieren?Wie formatieren Doppelwert für ein bestimmtes Gebietsschema und die Anzahl der Dezimalstellen?

Zum Beispiel habe ich diese Werte:

double d1 = 123456.78; 
double d2 = 567890; 

Und ich mag, dass sie in der folgenden Art und Weise drucken, zum Beispiel mit dem US-Gebietsschema und 2 Dezimalstellen:

123,456.78 
567,890.00 

I don‘ In diesem Fall ist der Rundungsmodus tatsächlich wichtig, da diese doppelten Werte von einer BigDecimal mit dem gegebenen Maßstab erhalten werden, so dass ihre Anzahl an Dezimalstellen immer kleiner oder gleich der Anzahl der Dezimalstellen ist, die ich drucken möchte.

Edit:

Um die Dinge ein wenig klarer zu machen, ist das, was ich Geld in eine locale abhängig angezeigt werden soll, aber mit einer festen Anzahl von Dezimalstellen. Im obigen Beispiel wurde gezeigt, wie die Werte formatiert werden sollen, wenn das Gebietsschema des Systems lautet. Jetzt kann sagen, das Systemgebietsschema ist cs_CZ (Tschechisch), so dass die gleichen Zahlen sollten auf diese Weise formatiert werden:

123 456,78 
567 890,00 

Nun, wie kann ich eine Number bis zu immer zwei Dezimalstellen angezeigt werden, aber angezeigt werden Tausendertrennzeichen und Dezimalpunkt basierend auf dem aktuellen Gebietsschema?

Antwort

36

Wenn Sie kümmern Number in der Dokumentation, die Lösung wäre offensichtlich zu lesen:

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

Auf meinem Rechner diese ausdruckt:

123 456,78
567 890,00
pl-PL

Ich glaube, das ist, was Sie suchen, ein d Sie müssen nicht mit Mustern herumspielen. Ich würde das nicht tun - zum Beispiel gibt es Locales, die Ziffern um zwei gruppieren, nicht um drei (das ist der Grund, warum wir über Gruppentrenner und nichtTausende Separator) sprechen.

+0

Vielen Dank – Sayka

+0

@ Paweł Dyda Wie soll ich einen String 123,456.78 in US locale zu einem doppelten Wert 123456.78 konvertieren? – KJEjava48

3

Man könnte so etwas wie

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

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

    } 

Diese Funktion sollten Sie die gewünschte Formatierung.

0

wandelt einen doppelten Wert in einen doppelten Wert mit einer beliebigen Anzahl von Nachkommastellen um. Ich habe diese Methode in einer Utility-Klasse erstellt, um über das Projekt darauf zuzugreifen.

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