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

我编辑了我的信息的一部分,因为它被证明是由于人为错误(忘记提交数据并且正在查看错误的内容),所以没有任何意义。

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

正如其他人提到的那样,使用格式化程序可以正常工作。只需使用格式化程序,对于 JSF 前端也是如此,格式化程序可以正确完成工作并了解语言环境。

于 2012-03-26T15:18:47.277 回答
5

这在我的情况下有效:

DecimalFormat df2 = new DecimalFormat("#.##");           
df2.setDecimalFormatSymbols(DecimalFormatSymbols.getInstance(Locale.ENGLISH));
于 2020-07-17T21:02:22.397 回答
3
String money = output.replace(',', '.');
于 2013-08-01T14:53:13.630 回答
0

您可以在方法中返回字符串之前使用替换功能

return df.format(bd).replace(",", ".")
于 2020-11-03T15:49:40.627 回答
0

这对我有用...

    double num = 10025000;
    new DecimalFormat("#,###.##");
    DecimalFormat df = (DecimalFormat) DecimalFormat.getInstance(Locale.GERMAN);
    System.out.println(df.format(num));
于 2020-12-21T09:42:44.903 回答