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


204

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

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

我已阅读,尤其是这种死亡,但现在我无法找到一个方法来完成这件事。我是否以错误的方式处理?有更优雅的方法吗?甚至可能是一个解决方案,说明了不同的本地号码表示形式,因为按照欧洲标准,逗号将是完美的。


Answers:


323

您可以通过设置区域设置或使用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);

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

Locale currentLocale = Locale.getDefault();

1
您可以使用十进制格式的applyPattern来获取.00
krystan荣誉

我已经更改了otherSymbols.setDecimalSeparator(','); 作为otherSymbols.setDecimalSeparator('。'); 谢谢。对我有用。
Aakanksha

2
格式就是这样,例如,String formatString = "#,###,###,##0.00";请参见docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html以获取语法
Vulpo

1
“您可以使用欧洲语言环境”。好吧,您不能使用任何来自欧洲的语言环境,因为Locale.UK它将返回,1,567.90 而不会返回1.567,90
JuniorMayhé17

旁注:NumberFormat.getNumberInstance()在某些Android 7设备上运行异常缓慢。一个替代方案是String.format()运行速度快。参见stackoverflow.com/questions/2379221/java-currency-number-format
Mr-IDE

14

欧洲非常庞大。我不确定他们是否全部使用相同的格式。但是,这个这个答案将有所帮助。

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

即使用正确的语言环境。


1
的确是先生!在英国可以看到“ 1,234.00英镑”,而在法国将看到“ 1 234,00欧元”(组分隔符,十进制分隔符,货币符号和货币头寸已更改)。
Vulpo '16

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

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前端相同),格式化程序就可以正确地完成工作并知道语言环境。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.