217

私は 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

セパレーターは、コンマではなく、ドットまたはポイントにする必要があります。この小さな偉業を達成する方法の手がかりを持っている人はいますか?

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

4

8 に答える 8

360

ロケールを設定するか、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();
于 2011-02-19T23:33:48.180 に答える
15

ヨーロッパはかなり巨大です。全体で同じフォーマットを使用しているかどうかはわかりません。ただし、これまたはこの回答は役に立ちます。

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

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

于 2011-02-19T23:33:16.480 に答える
10
public String getGermanCurrencyFormat(double value) {
    NumberFormat nf = NumberFormat.getNumberInstance(Locale.GERMAN);
    nf.setGroupingUsed(true);
    return "€ " + nf.format(value);
}
于 2011-10-15T14:28:48.417 に答える
5

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

Locale.getDefault(); //returns sl_SI

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

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

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

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

BigDecimalと同じように、Javaの.toString()関数についても言えます。それはある意味で良いことだと思います。たとえば、シリアル化またはデバッグ。固有の文字列表現があります。

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

于 2012-03-26T15:18:47.277 に答える
3
String money = output.replace(',', '.');
于 2013-08-01T14:53:13.630 に答える