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

时间:2011-02-19 23:11:24

标签: java android bigdecimal decimal-point 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);
}

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

xxx,xxx

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

我现在已经阅读了this,尤其是this,但我找不到办法让这件事完成。 我是以错误的方式接近这个吗?这样做有更优雅的方式吗?甚至可能是一个解决不同本地数字表示的解决方案,因为逗号在欧洲标准下是完美的。

9 个答案:

答案 0 :(得分:290)

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

答案 1 :(得分:13)

欧洲非常庞大。我不确定他们是否全都使用相同的格式。但是,thisthis回答会有所帮助。

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 :(得分:8)

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

答案 3 :(得分: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前端,格式化程序正确地完成工作并了解区域设置。

答案 4 :(得分:3)

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

答案 5 :(得分:3)

这对我而言有效:

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

答案 6 :(得分:0)

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

polyfills.ts

答案 7 :(得分:0)

这对我有用...

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

答案 8 :(得分:-5)

  

只需替换'。'在UI端使用','

import java.text.DecimalFormat;
public MyClass{
    private String netAmount;
    private static DecimalFormat twoDecimalForm = new DecimalFormat("00.00");

    public MyClass(double amount){
        //converting to required decimal format in constructor or/and setter
        this.amount=twoDecimalForm.format(amount);
    }

    public String getAmount() {
        //replacing decimal point with  comma so that in JSP ELs you'll get it in comma format
        return amount.replace(".",",");
    }
    public void setAmount(String amount) {
        this.amount = amount;
    }
}