Java NumberFormat不将逗号视为小数分隔符

时间:2014-02-17 04:56:05

标签: java string-formatting currency number-formatting decimal-point

我在我的应用中发现了一个错误,我的货币字符串在使用国际格式时没有显示正确的分组和小数分隔符。我提取代码以试图隔离并演示问题。在下面的代码中,我创建了一个美国格式化程序和一个World格式化程序。它们都使用相同的货币模式,但USA格式化程序使用句点作为小数分隔符,而World格式化程序使用逗号作为小数分隔符。

当我要求世界格式化程序告诉我它的分隔符是什么时,它会正确地报告它们。但是,当我有它为我的值生成字符串时,它没有正确地执行它。它奇怪地使用分组和小数分隔符的句点。

public static void main(String[] args) throws Exception {

    String currencyFormat = "¤#,##0.00;-¤#,##0.00";
    NumberFormat currencyUSA = NumberFormat.getCurrencyInstance();
    DecimalFormat decimalCurrencyUSA = (DecimalFormat)currencyUSA;
    decimalCurrencyUSA.applyPattern(currencyFormat);

    NumberFormat currencyWorld = NumberFormat.getCurrencyInstance();
    DecimalFormat decimalCurrencyWorld = (DecimalFormat)currencyWorld;
    decimalCurrencyWorld.applyPattern(currencyFormat);

    DecimalFormatSymbols decimalFormatSymbols = decimalCurrencyWorld.getDecimalFormatSymbols();
    //DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols(Locale.GERMAN);

    System.out.println(String.format("Original grouping: %c decimal: %c", decimalFormatSymbols.getGroupingSeparator(), decimalFormatSymbols.getDecimalSeparator()));
    decimalFormatSymbols.setDecimalSeparator(',');
    decimalFormatSymbols.setGroupingSeparator('.');
    decimalCurrencyWorld.setDecimalFormatSymbols(decimalFormatSymbols);
    System.out.println(String.format("  After grouping: %c decimal: %c", decimalFormatSymbols.getGroupingSeparator(), decimalFormatSymbols.getDecimalSeparator()));

    String moneyUSA = currencyUSA.format(1500.75);
    String moneyWorld = currencyWorld.format(1500.75);

    DecimalFormatSymbols decimalFormatSymbols2 = decimalCurrencyWorld.getDecimalFormatSymbols();
    System.out.println(String.format("   Real grouping: %c decimal: %c", decimalFormatSymbols2.getGroupingSeparator(), decimalFormatSymbols2.getDecimalSeparator()));

    System.out.println(String.format("  USA String: %s", moneyUSA));
    System.out.println(String.format("World String: %s", moneyWorld));

    Number numberUSA = currencyUSA.parse(moneyUSA);
    Number numberWorld = currencyWorld.parse(moneyWorld);

    System.out.println(String.format("  USA Number: %f", numberUSA));
    System.out.println(String.format("World Number: %f", numberWorld));

}

当我运行上面的代码时(在我的Mac OS X 10.9,Eclipse Indigo,Java 1.6上),输出是:

Original grouping: , decimal: .
  After grouping: . decimal: ,
   Real grouping: . decimal: ,
  USA String: $1,500.75
World String: $1.500.75
  USA Number: 1500.750000
World Number: 1.500000

世界货币价值应为1.500,75美元,但它在两个地方都使用了一段时间。

编辑:

我需要专门控制分隔符。在涉及货币符号时,我可以尊重用户的区域设置,但由于此应用程序的要求,我需要为用户提供在分隔符时交换句点/逗号的功能。我不能仅仅依靠Locale来控制这些东西。

问题是我在格式化程序中清楚地设置了这些值,并且它们没有被尊重。

编辑2:我添加了代码然后解析先前生成的money字符串,以查看是否正在考虑Decimal分隔符进行解析,而不是格式化。似乎在解析过程中,句点仍然被视为小数点分隔符,因为世界号码是1.5而不是1500.75。

2 个答案:

答案 0 :(得分:3)

如果你改变了

DecimalFormatSymbols decimalFormatSymbols = decimalCurrencyWorld.getDecimalFormatSymbols();

DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols(Locale.GERMAN);

(或其他一些Locale)您会发现分隔符正常工作。

decimalFormatSymbols.setDecimalSeparator(',');显然不会改变格式(尽管setGroupingSeparator()会这样做,正如您所发现的那样)。

答案 1 :(得分:3)

来自Customizing Formats

  货币符号;用货币符号代替;如果翻倍,用国际货币符号代替; 如果存在于模式中,则使用货币小数点分隔符而不是小数点分隔符

所以:

decimalFormatSymbols.setMonetaryDecimalSeparator(',');

会这样做。