【问题标题】:Different Formats between java8 and java12java 8 和 java 12 的不同格式
【发布时间】:2019-07-24 14:13:01
【问题描述】:

使用 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 decimalformat


【解决方案1】:

不确定这是否是 java 端的缺陷,但问题似乎是 Locale 对象。在 java 8 中,当您检索 GroupingSeparator(如 decimalFormat.getDecimalFormatSymbols().getGroupingSeparator())时,您将得到一个“。”特点。但在 Java 12 中,返回值是“á”,即 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.
}

让我知道这是否至少解决了问题,如果不能揭示问题所在。 还发现Locale特定的数字和分组分隔符是由jre提供的,所以可能只是底层提供者有问题

【讨论】:

  • Oracle JRE/JDK 和 OpenJRE/JDK 会发生这种情况。
  • @Philipp Schneider,您可以尝试使用 -Djava.locale.providers=JRE 参数运行,看看会发生什么?
  • 有了这个参数就可以了。似乎是 CLDR 的一个错误。
  • @PhilippSchneider 太好了,您可以找到问题的根源
【解决方案2】:

问题不是 java 问题。似乎是CLDR中的一个错误。奥地利与德国不同,但不应该。

(http://openjdk.java.net/jeps/252) Java 使用了来自 CLDR 的数据。

设置参数 -Djava.locale.providers=COMPAT,SPI 会像 java8 一样工作。

我将在 CLDR 为这个问题开一张票。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-19
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 2020-09-20
    • 1970-01-01
    相关资源
    最近更新 更多