使用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())时,您将获得一个“”。字符。但是在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.
}


让我知道这个问题是否解决了,如果没有揭示问题是什么。
还发现jre提供了特定于语言环境的数字和分组分隔符,因此它可能只是底层提供程序有问题

关于java - java8和java12之间的不同格式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57185015/

10-10 22:21