Biçimlendirilmiş BigDecimal değerleri nasıl yazdırılır?


104

Bir var BigDecimalbir alan amountpara temsil eder ve ben gibi bir formatta tarayıcıdaki değerini yazdırmak gerekiyor $123.00, $15.50, $0.33.

Bunu nasıl yapabilirim?

(Kendimi olduğunu öğrenmelisiniz sadece basit bir çözüm floatValueelde BigDecimalkullanılarak ardından ve NumberFormatfraksiyon bölümü için iki basamaklı hassas hale getirmek için).

Yanıtlar:


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

LocalePara birimi sembolünüzü seçmek için JVM'nizin mevcut varsayılanını kullanacaktır. Veya bir Locale.

NumberFormat.getInstance(Locale.US)

Daha fazla bilgi için NumberFormatsınıfa bakın .


DecimalFormat'ın yaptığı gibi bir kalıp belirlemek mümkün müdür?
Philippe Gioseffi

71

Binlik ayırıcı ayarlamak için, DecimalFormat123,456.78 kullanmanız gerektiğini söyleyin :

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

İşte sonuç:

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

#,###.00Maskeyi ayarlasam da , daha uzun değerleri de başarıyla biçimlendiriyor. Sonuçtaki virgül (,) ayırıcısının yerel ayarınıza bağlı olduğunu unutmayın. Rus yerel ayarı için sadece boşluk () olabilir.


19
Sıfırın 0,00 olarak (0,00 yerine) görüntülenmesini tercih ediyorsanız, "#,##0.00"bunun yerine kalıbı kullanın.
Jonik

35

Verilen durum için mantıklı olabilecek başka bir yol da

BigDecimal newBD = oldBD.setScale(2);

Bunu söylüyorum çünkü bazı durumlarda para söz konusu olduğunda 2 ondalık basamağın ötesine geçmek bir anlam ifade etmiyor. Bunu bir adım daha ileri götürürsek, bu yol açabilir

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

ancak sadece setScale yöntemini vurgulamak istedim (bu son ondalık basamağın nasıl işleneceğini kontrol etmek için ikinci bir yuvarlama modu argümanı da alabilir. Bazı durumlarda Java sizi bu yuvarlama yöntemini belirtmeye zorlar).


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

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

// 3.14 yazdırır

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

// 13 yazdırır


6

@Jeff_Alieffson tarafından verilen yanıta benzer, ancak varsayılana bağlı değil Locale:

DecimalFormatSymbolsAçık yerel ayar için kullanın :

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

Veya açık ayırıcı semboller:

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

Sonra:

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

Sonuç:

12 345.00

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

1
BigDecimal (19.001) .setScale (2, BigDecimal.ROUND_HALF_UP) .toString () olmalıdır
Jeff
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.