DecimalFormatの小数点記号をコンマからドット/ポイントに変更する方法は?


204

BigDecimal値を見やすく読みやすい文字列に変換する、この少しクレイジーなメソッドがあります。

private String formatBigDecimal(BigDecimal bd){
    DecimalFormat df = new DecimalFormat();
    df.setMinimumFractionDigits(3);
    df.setMaximumFractionDigits(3);
    df.setMinimumIntegerDigits(1);
    df.setMaximumIntegerDigits(3);
    df.setGroupingSize(20);
    return df.format(bd);
}

ただし、これは、","すべての値を次のように出力する、いわゆるグループ化区切り文字も生成します。

xxx,xxx

区切り文字は、カンマではなくドットまたはポイントにする必要があります。誰かがこの小さな偉業を達成する方法の手がかりを持っていますか?

私はこれを読み、特にこれを今は死ぬまで読んだことがありますが、これを成し遂げる方法を見つけることができません。私はこれに間違った方法でアプローチしていますか?これを行うよりエレガントな方法はありますか?おそらく、カンマはヨーロッパの基準で完璧であるため、さまざまな市内番号表現を考慮したソリューションでさえあるかもしれません。


回答:


323

ロケールを設定するか、DecimalFormatSymbolsを使用して、セパレーターを変更できます。

グループ化区切り文字をポイントにしたい場合は、ヨーロッパのロケールを使用できます。

NumberFormat nf = NumberFormat.getNumberInstance(Locale.GERMAN);
DecimalFormat df = (DecimalFormat)nf;

または、DecimalFormatSymbolsクラスを使用して、formatメソッドによって生成されるフォーマット済みの数値に表示される記号を変更できます。これらの記号には、小数点記号、グループ化区切り記号、マイナス記号、パーセント記号などがあります。

DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols(currentLocale);
otherSymbols.setDecimalSeparator(',');
otherSymbols.setGroupingSeparator('.'); 
DecimalFormat df = new DecimalFormat(formatString, otherSymbols);

currentLocaleはLocale.getDefault()から取得できます。つまり、

Locale currentLocale = Locale.getDefault();

1
10進形式でapplyPatternを使用して、.00を取得できます
クリスタンは14

otherSymbols.setDecimalSeparator( '、');を変更しました。otherSymbols.setDecimalSeparator( '。'); ありがとう。
アーカンシャ2015

2
形式は次のようになります。たとえば、構文String formatString = "#,###,###,##0.00";についてはdocs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.htmlをご覧ください
Vulpo

1
「ヨーロッパのロケールを使用できます」。まあ、ヨーロッパからのロケールは使用できません。Locale.UK返されるの1,567.90 は1.567,90ではなく
ジュニアメイヘ

補足:NumberFormat.getNumberInstance()一部のAndroid 7デバイスでは、実行が異常に遅くなることがあります。代替案はString.format()、迅速に実行することです。stackoverflow.com/questions/2379221/java-currency-number-formatを
Mr-IDE

14

ヨーロッパは非常に巨大です。彼らがすべて同じフォーマットを使用しているかどうかはわかりません。しかし、これまたはこの答えは役に立ちます。

String text = "1,234567";
NumberFormat nf_in = NumberFormat.getNumberInstance(Locale.GERMANY);
double val = nf_in.parse(text).doubleValue();

NumberFormat nf_out = NumberFormat.getNumberInstance(Locale.UK);
nf_out.setMaximumFractionDigits(3);
String output = nf_out.format(val);

つまり、正しいロケールを使用します。


1
確かに!英国では「£1,234.00」が表示されますが、フランスでは「1 234,00€」が予想されます(グループ区切り文字、小数点区切り文字、通貨記号、通貨位置が変更されています)。
Vulpo 2016年

9
public String getGermanCurrencyFormat(double value) {
    NumberFormat nf = NumberFormat.getNumberInstance(Locale.GERMAN);
    nf.setGroupingUsed(true);
    return "€ " + nf.format(value);
}

5

BigDecimalはロケール設定を尊重していないようです。

Locale.getDefault(); //returns sl_SI

スロベニア語ロケールには、10進数のコンマが必要です。数字に関して奇妙な誤解があったと思います。

a = new BigDecimal("1,2") //throws exception
a = new BigDecimal("1.2") //is ok

a.toPlainString() // returns "1.2" always

人為的エラーが原因であることが判明したため、意味のないメッセージの一部を編集しました(データをコミットするのを忘れて、間違ったものを見ていました)。

BigDecimalがJavaの.toString()関数で言えることと同じです。それはある意味で良いことだと思います。たとえばシリアル化またはデバッグ。ユニークな文字列表現があります。

他の人が述べたように、フォーマッタの使用は問題なく動作します。JSFフロントエンドと同じようにフォーマッターを使用するだけで、フォーマッターは適切に機能し、ロケールを認識します。


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