BigDecimalを最大2桁の10進数の文字列としてフォーマットし、小数部分の0を削除します


80

私はBigDecimal番号を持っていて、小数点以下2桁しか考慮しないので、次を使用して切り捨てます。

bd = bd.setScale(2, BigDecimal.ROUND_DOWN)

次に、文字列として出力しますが、0の場合は小数部分を削除します。次に例を示します。

1.00-> 1

1.50-> 1.5

1.99-> 1.99

Formatter、formatter.formatを使用してみましたが、常に小数点以下2桁が表示されます。

これどうやってするの?たぶんbd.toPlainString()からの文字列に取り組んでいますか?

回答:


103

文字列をフォーマットする代わりに、BigDecimalのフォーマットにDecimalFormatを使用しましたが、問題はないようです。

コードは次のようなものです。

bd = bd.setScale(2, BigDecimal.ROUND_DOWN);

DecimalFormat df = new DecimalFormat();

df.setMaximumFractionDigits(2);

df.setMinimumFractionDigits(0);

df.setGroupingUsed(false);

String result = df.format(bd);

このプログラムの期待される出力は何ですか。小数点以下の後続ゼロにも同じ要件がありますが、出力で.00のような末尾ゼロが切り捨てられます。
Paramesh Korrakuti 2015年

1
@ParameshKorrakutidf.setMinimumFractionDigits(2)は、setScale、setGrouping、およびsetMaxFracがなくても正常に機能します。
アンドリューグラインダー2015

4
10進形式は、変装したNumberFormatです。使用NumberFormat numberFormat = NumberFormat.getPercentInstance();後、numberFormat.setMinimumFractionDigits(2);そしてString percent = numberFormat.format(yourBigDecimal);
アンドリュー・グラインダー

1
Java9以降BigDecimal.ROUND_DOWNは非推奨です。RoundingMode.DOWN代わりに使用してください。
ディランサ

69
new DecimalFormat("#0.##").format(bd)

42
new DecimalFormat("0.00")小数点以下2桁が常に表示されるようにする場合に使用1000.51000.50ます。たとえば、として表示されます。
Chris Parton

1
@ChrisPartonのソリューションは完全に機能します。さらに、ローカリゼーションを適用する必要がある場合は、以下のロジックを使用できます。 import java.math.BigDecimal; import java.text.*; public class LocalizeExample { public static void main(String[] args) { BigDecimal bd = new BigDecimal("123.10"); DecimalFormat decimalFormat = (DecimalFormat) NumberFormat.getNumberInstance(Locale.GERMAN); decimalFormat.applyPattern("#0.00"); String result = decimalFormat.format(bd); System.out.println(result); } }
Paramesh Korrakuti 2015年

14

以下のコードが役立つ場合があります。

protected String getLocalizedBigDecimalValue(BigDecimal input, Locale locale) {
    final NumberFormat numberFormat = NumberFormat.getNumberInstance(locale);
    numberFormat.setGroupingUsed(true);
    numberFormat.setMaximumFractionDigits(2);
    numberFormat.setMinimumFractionDigits(2);
    return numberFormat.format(input);
}


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.