我在我的应用程序中发现了一个错误,在使用国际格式时,我的货币字符串未显示正确的分组和小数点分隔符。我提取了代码以尝试隔离并演示问题。在下面的代码中,我创建了一个美国格式化程序和一个世界格式化程序。它们都使用相同的货币模式,但美国格式化程序使用句号作为小数点分隔符,世界格式化程序使用逗号作为小数点分隔符。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。
是的,这将起作用。1+ –
我无法像这个应用程序那样明确设置区域设置。货币符号遵守用户的默认区域设置,但我必须直接控制小数点和分组分隔符。我的应用模拟器的惠普10bii金融计算器有一个按钮,可以从句点换成逗号,所以我需要模仿该功能。 –
我很惊讶,decimalFormatSymbols.setDecimalSeparator(',');不像我们预期的那样行事,而setGroupingSeparator确实有效。这是Java中的一个错误(我倾向于认为这不太可能,但你永远不知道),或者我们错过了一个假设。 –