java8 和 java12 之间的不同格式
Different Formats between java8 and java12
使用 Java8 以下代码运行良好。现在我想升级到 java12 我遇到了问题,这行不通。
public static void main(String[] args) {
Double d = new Double(123456.8912);
Locale locale = new Locale.Builder().setLanguage("de").setRegion("AT").build();
DecimalFormat decimalFormat = (DecimalFormat) DecimalFormat.getInstance(locale);
decimalFormat.applyLocalizedPattern("#.##0,00");
System.out.println(decimalFormat.format(d.doubleValue()));
// Excpected is 123.456,89
// Output is 123456,89.
}
不确定这是否是 java 端的缺陷,但问题似乎出在 Locale 对象上。在 java 8 中,当您检索 GroupingSeparator(如 decimalFormat.getDecimalFormatSymbols().getGroupingSeparator())时,您将得到一个“.”特点。但是在 Java12 中,返回值是 "á",即 unicode \u00E0。我尝试将模式更改为“#\u00E0##0,00”,但这没有用。然后我更改了区域设置生成器以使用奥地利的 UN M.49 3 位代码(即 040。完整列表可在此处找到:https://unstats.un.org/unsd/methodology/m49/)。那解决了问题。下面是我使用的代码
public static void main(String[] args) {
Double d = new Double(123456.8912);
Locale locale = new Locale.Builder().setLanguage("de").setRegion("040").build();
DecimalFormat decimalFormat = (DecimalFormat) DecimalFormat.getInstance(locale);
System.out.println(decimalFormat.getDecimalFormatSymbols().getDecimalSeparator());
System.out.println( decimalFormat.getDecimalFormatSymbols().getGroupingSeparator());
System.out.println((int) decimalFormat.getDecimalFormatSymbols().getGroupingSeparator());
decimalFormat.applyLocalizedPattern("#.##0,00");
System.out.println(decimalFormat.format(d.doubleValue()));
// Excpected is 123.456,89
// Output is 123456,89.
}
让我知道这是否至少解决了问题,如果没有解决问题是什么。
还发现 jre 提供了 Locale 特定数字和分组分隔符,因此可能只是底层提供程序有问题
问题不是 java 问题。似乎是 CLDR 中的错误。奥地利与德国不同,但不应该。
(http://openjdk.java.net/jeps/252) Java 使用了来自 CLDR 的数据。
使用参数 -Djava.locale.providers=COMPAT,SPI 设置它将像 java8.
这个问题我会在CLDR开工单
使用 Java8 以下代码运行良好。现在我想升级到 java12 我遇到了问题,这行不通。
public static void main(String[] args) {
Double d = new Double(123456.8912);
Locale locale = new Locale.Builder().setLanguage("de").setRegion("AT").build();
DecimalFormat decimalFormat = (DecimalFormat) DecimalFormat.getInstance(locale);
decimalFormat.applyLocalizedPattern("#.##0,00");
System.out.println(decimalFormat.format(d.doubleValue()));
// Excpected is 123.456,89
// Output is 123456,89.
}
不确定这是否是 java 端的缺陷,但问题似乎出在 Locale 对象上。在 java 8 中,当您检索 GroupingSeparator(如 decimalFormat.getDecimalFormatSymbols().getGroupingSeparator())时,您将得到一个“.”特点。但是在 Java12 中,返回值是 "á",即 unicode \u00E0。我尝试将模式更改为“#\u00E0##0,00”,但这没有用。然后我更改了区域设置生成器以使用奥地利的 UN M.49 3 位代码(即 040。完整列表可在此处找到:https://unstats.un.org/unsd/methodology/m49/)。那解决了问题。下面是我使用的代码
public static void main(String[] args) {
Double d = new Double(123456.8912);
Locale locale = new Locale.Builder().setLanguage("de").setRegion("040").build();
DecimalFormat decimalFormat = (DecimalFormat) DecimalFormat.getInstance(locale);
System.out.println(decimalFormat.getDecimalFormatSymbols().getDecimalSeparator());
System.out.println( decimalFormat.getDecimalFormatSymbols().getGroupingSeparator());
System.out.println((int) decimalFormat.getDecimalFormatSymbols().getGroupingSeparator());
decimalFormat.applyLocalizedPattern("#.##0,00");
System.out.println(decimalFormat.format(d.doubleValue()));
// Excpected is 123.456,89
// Output is 123456,89.
}
让我知道这是否至少解决了问题,如果没有解决问题是什么。 还发现 jre 提供了 Locale 特定数字和分组分隔符,因此可能只是底层提供程序有问题
问题不是 java 问题。似乎是 CLDR 中的错误。奥地利与德国不同,但不应该。
(http://openjdk.java.net/jeps/252) Java 使用了来自 CLDR 的数据。
使用参数 -Djava.locale.providers=COMPAT,SPI 设置它将像 java8.
这个问题我会在CLDR开工单