【问题标题】:Discrepancies between Java 11 and Java 8 DecimalFormat behaviourJava 11 和 Java 8 DecimalFormat 行为之间的差异
【发布时间】:2021-05-25 20:18:43
【问题描述】:

我在使用 Java 11 时遇到了一个奇怪的问题。我正在移植一个大型项目,并且我有一些使用 DecimalFormat 的测试在 11 版本中失败,但在 8 版本中没有。

Java 11 中的 DecimalFormat 给了我一个逗号小数分隔符,而在 Java 8 中它给了我一个点。

这是一个最小的可重现示例:

import java.text.DecimalFormat;

public class Test {

  public static void main(String[] args) {
    DecimalFormat format = new DecimalFormat("#0.00");
    System.out.println(format.format(1.02));
  }
}

在 Java 8 上输出 1.02,在 Java 11 上输出 1,02

以下是使用两个版本构建和运行示例的整个终端会话:

~ » sdk use java 8.0.282.hs-adpt

Using java version 8.0.282.hs-adpt in this shell.

~ » javac -version 
javac 1.8.0_282

~ » javac Test.java                                   

~ » java -version                                                                                                                                                                                                       
openjdk version "1.8.0_282"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_282-b08)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.282-b08, mixed mode)

~ » java Test                                                                                                                                                                                                           
1.02                                                                

~ » sdk use java 11.0.10.hs-adpt                                                                                                                                                                                        

Using java version 11.0.10.hs-adpt in this shell.

~ » javac -version                                                                                                                                                                                                      
javac 11.0.10

~ » javac Test.java                                             

~ » java -version                                                                                                                                                                                                       
openjdk version "11.0.10" 2021-01-19
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.10+9)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.10+9, mixed mode)

~ » java Test                                                                                                                                                                                                           
1,02

有没有人遇到过类似的问题? 8 到 11 之间的相关类是否有任何更改会导致这种情况?

【问题讨论】:

标签: java java-8 java-11


【解决方案1】:

是的,其中一项更改是将区域设置数据更新为 Unicode CLDR v33(请参阅 https://www.oracle.com/java/technologies/javase/jdk-11-relnote.html

此更改与特定于区域设置的格式相关,这会影响 DecimalFormatSimpleDateFormat 等实用程序的使用。

因此,如果您的代码依赖于特定于语言环境的格式,则应在切换到 Java 11 后仔细检查。

【讨论】:

  • 我仍然不明白为什么会发生这种情况。使用的语言环境没有改变,是吗?为什么Java版本之间相同语言环境的小数分隔符会发生变化?
  • @gsl 因为他们更改了区域设置数据(包括小数分隔符)
猜你喜欢
  • 1970-01-01
  • 2021-08-19
  • 2019-10-27
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2014-08-09
相关资源
最近更新 更多