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

Mir*_*ess 192 java android decimal-point bigdecimal decimalformat

我有一个小的疯狂方法,将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);
}
Run Code Online (Sandbox Code Playgroud)

然而,它还产生了一个所谓的分组分隔符",",它使我的所有值都出现如下:

xxx,xxx
Run Code Online (Sandbox Code Playgroud)

我确实需要分隔符是点或点而不是逗号.有没有人知道如何完成这个小壮举?

我已阅读,尤其是这个,现在死,但我无法找到一个方法来完成这件事.我是以错误的方式接近这个吗?这样做有更优雅的方式吗?甚至可能是一个解决不同本地数字表示的解决方案,因为逗号将完全符合欧洲标准.

Chr*_*ris 309

您可以通过设置区域设置或使用DecimalFormatSymbols来更改分隔符.

如果要将分组分隔符作为一个点,则可以使用欧洲语言环境:

NumberFormat nf = NumberFormat.getNumberInstance(Locale.GERMAN);
DecimalFormat df = (DecimalFormat)nf;
Run Code Online (Sandbox Code Playgroud)

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

DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols(currentLocale);
otherSymbols.setDecimalSeparator(',');
otherSymbols.setGroupingSeparator('.'); 
DecimalFormat df = new DecimalFormat(formatString, otherSymbols);
Run Code Online (Sandbox Code Playgroud)

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

Locale currentLocale = Locale.getDefault();
Run Code Online (Sandbox Code Playgroud)

  • 格式是这样的,例如`String formatString =“#,###,###,## 0.00”;`参见https://docs.oracle.com/javase/7/docs/api/java/ text / DecimalFormat.html用于语法 (2认同)
  • “您可以使用欧洲语言环境”。好吧,您不能使用欧洲的任何语言环境,因为 `Locale.UK` 将返回 `1,567.90 ` 而不是 1.567,90 (2认同)

Ren*_*eno 13

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

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);
Run Code Online (Sandbox Code Playgroud)

即使用正确的区域设置.

  • 确实是先生!在英国,将看到“£1,234.00”,而在法国,预期为“1,234,00€”(组分隔符、小数点分隔符、货币符号和货币位置已更改)。 (2认同)

Nat*_*ber 13

这对我来说有效:

DecimalFormat df2 = new DecimalFormat("#.##");           
df2.setDecimalFormatSymbols(DecimalFormatSymbols.getInstance(Locale.ENGLISH));
Run Code Online (Sandbox Code Playgroud)


小智 8

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


Nei*_*ius 5

BigDecimal似乎不尊重区域设置.

Locale.getDefault(); //returns sl_SI
Run Code Online (Sandbox Code Playgroud)

斯洛文尼亚语语言环境应该有一个小数点逗号.猜猜我对数字有一些奇怪的误解.

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

a.toPlainString() // returns "1.2" always
Run Code Online (Sandbox Code Playgroud)

我编辑了我的一部分消息,因为它被证明是由于人为错误(忘记提交数据并且看错了),因此没有任何意义.

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

另外正如其他人提到的使用格式化工作正常.只需使用格式化程序,同样适用于JSF前端,格式化程序可以正常工作并了解区域设置.