我有一个疯狂的小方法,可以将 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
我确实需要分隔符是一个点或一个点,而不是逗号。 有人知道如何完成这个小壮举吗?
我已经读完了this,特别是this,但我找不到办法完成这件事。 我是否以错误的方式处理这个问题?有没有更优雅的方法来做到这一点?甚至可能是考虑不同本地数字表示的解决方案,因为按照欧洲标准,逗号是完美的。
您可以通过设置区域设置或使用 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();
欧洲很大。我不确定他们是否都使用相同的格式。然而,this或this答案会有帮助。
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);
即使用正确的区域设置。
这对我的情况有效:
DecimalFormat df2 = new DecimalFormat("#.##");
df2.setDecimalFormatSymbols(DecimalFormatSymbols.getInstance(Locale.ENGLISH));
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 前端也是如此,格式化程序可以正确完成工作并了解区域设置。
String money = output.replace(',', '.');
这对我有用......
double num = 10025000;
new DecimalFormat("#,###.##");
DecimalFormat df = (DecimalFormat) DecimalFormat.getInstance(Locale.GERMAN);
System.out.println(df.format(num));
您可以在方法中返回字符串之前使用替换函数
return df.format(bd).replace(",", ".")
DecimalFormat dFormat = new DecimalFormat("#.#", new DecimalFormatSymbols(Locale.US));