如何将DecimalFormat的小数分隔符从逗号更改为点?

231

我有一个小方法,它可以将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

我需要使用点作为分隔符而不是逗号。有人知道如何完成这个小任务吗?

我已经详细阅读了这个页面和尤其是这个页面,但我找不到实现的方法。我是否在错误的方向上尝试解决问题?是否有更加优雅的方式来做到这一点?甚至可能还考虑到不同地区数字表示的差异,因为逗号是按照欧洲标准的理想分隔符。


请参见https://dev59.com/y2435IYBdhLWcg3wvy2_。 - Vadzim
更改语言,这对我有用。https://dev59.com/um445IYBdhLWcg3wR4NN?answertab=active#tab-top - Alper Şekercioğlu
8个回答

385
您可以通过设置语言环境或使用DecimalFormatSymbols来改变分隔符。

如果您想让分组分隔符成为“点”,则可以使用欧洲语言环境:

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

或者您可以使用DecimalFormatSymbols类来更改由格式化方法生成的格式化数字中出现的符号。这些符号包括小数分隔符、分组分隔符、减号和百分号,等等:

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

currentLocale可以从Locale.getDefault()获取,即:

Locale currentLocale = Locale.getDefault();

1
你可以在十进制格式上使用applyPattern来获得你的.00。 - krystan honour
1
我已将 otherSymbols.setDecimalSeparator(',') 更改为 otherSymbols.setDecimalSeparator('.')。谢谢。它对我有用。 - Aakanksha
2
这是格式的样式,例如 String formatString = "#,###,###,##0.00"; 请参阅 https://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html 了解语法。 - Vulpo
2
你可以使用欧洲区域设置。但是,你不能使用来自欧洲的任何区域设置,因为 Locale.UK 将返回 1,567.90 而不是 1.567,90 - Junior Mayhé
1
我尝试了你的方法,但是直到我调用了df.setDecimalFormatSymbols(otherSymbols)方法(感谢Oracle文档),它才开始工作。请考虑在你的回答中包含这个信息。 - Sergey Zolotarev
显示剩余4条评论

16

欧洲非常大,我不确定他们是否在全境使用相同的格式。然而,这个这个答案会有所帮助。

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

即使用正确的区域设置。


2
确实,先生!在英国,“£1,234.00”是常见的,而在法国,则期望看到“1 234,00€”(分组分隔符、小数分隔符、货币符号和货币位置已更改)。 - Vulpo

12

这在我的情况下有效:

DecimalFormat df2 = new DecimalFormat("#.##");           
df2.setDecimalFormatSymbols(DecimalFormatSymbols.getInstance(Locale.ENGLISH));

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

5

BigDecimal似乎不遵守Locale设置。

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 前端,格式化程序可以正确地执行任务并了解区域设置。


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

6
数字可以用阿拉伯格式,并使用另一个分隔符:(٫)(在十六进制中为U+066B)。 数字也不同:https://en.wikipedia.org/wiki/Arabic_(Unicode_block) - mtrakal

2
你可以在方法返回字符串之前使用replace函数。
return df.format(bd).replace(",", ".")

1

这对我有用...

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接