web-dev-qa-db-ja.com

DecimalFormatの小数点をカンマからドット/ポイントに変更する方法

BigDecimal値をNiceと読みやすいStringsに変換する、このちょっと変わった方法があります。

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

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

私は this そして特に this を読んで今死んでいますが、これを成し遂げる方法を見つけることができません。私はこれに間違った方法で近づいていますか?もっとエレガントな方法はありますか。コンマはヨーロッパの規格では完璧なので、おそらくは別の市内番号表現を説明する解決策でも。

183
MiraFayless

ロケールを設定するか 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();
292
Chris

ヨーロッパはとても巨大です。私は彼らが至るところで同じフォーマットを使っているかどうかわからない。しかし this または this 答えが役に立つでしょう。

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

すなわち正しいロケールを使用してください。

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

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フロントエンドと同じフォーマッタを使用するだけで、フォーマッタは正しく機能し、ロケールを認識します。

5
Neikius
String money = output.replace(',', '.');
3