2

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

当我要求世界格式化程序告诉我它的分隔符是什么时,它会正确地报告它们。然而,当我有它为我的价值产生的字符串,它不正确做。它奇怪地使用了分组和小数分隔符的时间段。

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的靛蓝,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:我添加了代码,然后解析以前生成的钱字符串,以查看是否尊重Decimal分隔符的解析,但不格式化。看起来,在分析过程中,这个时期仍然被当作小数分隔符,因为世界数字是1.5而不是1500.75。

回答

2

Customizing Formats

¤货币符号;由货币符号取代;如果加倍,则由国际货币符号替代; 如果出现在某个模式,货币小数点分隔符是用来代替小数点分隔符

所以:

decimalFormatSymbols.setMonetaryDecimalSeparator(','); 

会做到这一点。

3

如果更改

DecimalFormatSymbols decimalFormatSymbols = decimalCurrencyWorld.getDecimalFormatSymbols();

DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols(Locale.GERMAN);

(或其他区域设置),你会发现,分离器正常工作。

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

+0

是的,这将起作用。1+ –

+0

我无法像这个应用程序那样明确设置区域设置。货币符号遵守用户的默认区域设置,但我必须直接控制小数点和分组分隔符。我的应用模拟器的惠普10bii金融计算器有一个按钮,可以从句点换成逗号,所以我需要模仿该功能。 –

+0

我很惊讶,decimalFormatSymbols.setDecimalSeparator(',');不像我们预期的那样行事,而setGroupingSeparator确实有效。这是Java中的一个错误(我倾向于认为这不太可能,但你永远不知道),或者我们错过了一个假设。 –

相关问题