我有这个疯狂的方法,可以将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

我需要分隔符是点或点,而不是逗号。 有人知道如何完成这个小壮举吗?

我已经读了这个,尤其是这个,但我找不到一种方法来完成它。 我说错了吗?还有更优雅的方式吗?也许甚至有一个解决方案,可以解释不同的本地数字表示,因为逗号将是完美的欧洲标准。


当前回答

String money = output.replace(',', '.');

其他回答

这对我很管用……

    double num = 10025000;
    new DecimalFormat("#,###.##");
    DecimalFormat df = (DecimalFormat) DecimalFormat.getInstance(Locale.GERMAN);
    System.out.println(df.format(num));

欧洲很大。我不确定他们是否使用相同的格式。然而,这个或这个答案将会有所帮助。

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

即使用正确的语言环境。

您可以通过设置区域设置或使用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();
public String getGermanCurrencyFormat(double value) {
    NumberFormat nf = NumberFormat.getNumberInstance(Locale.GERMAN);
    nf.setGroupingUsed(true);
    return "€ " + nf.format(value);
}

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

我编辑了一部分毫无意义的信息,因为它被证明是人为错误(忘记提交数据,看错了东西)。

与任何Java . tostring()函数的BigDecimal相同。我想这在某些方面是好事。例如序列化或调试。有一个唯一的字符串表示。

另外,正如其他人提到的,使用格式化程序也可以。只需使用格式化程序,JSF前端也是一样,格式化程序可以正确地完成工作,并且能够识别语言环境。