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开工单