Java 11和Java 8 DecimalFormat行为差异

5

我在Java 11中遇到了一个奇怪的问题,我正在移植一个庞大的项目,并且有一些测试使用DecimalFormat失败了,但是在Java 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

有人遇到了类似的问题吗?在Java 8和11之间是否对相关类进行了任何更改,导致出现这种情况?


4
看起来使用了不同的“Locale”。 - Henry
也许您遇到了区域设置的问题?请查看此问题:https://dev59.com/Zm445IYBdhLWcg3wE2Ne - raven1981
1
这个回答和这个帖子可能有所帮助:this answer and this thread - Naman
1个回答

7

是的,其中一个变化就是将Locale Data更新到Unicode CLDR v33(请参见https://www.oracle.com/java/technologies/javase/jdk-11-relnote.html)。

此更改与特定于区域设置的格式有关,这会影响像DecimalFormatSimpleDateFormat这样的工具的使用。

因此,如果您的代码依赖于特定于区域设置的格式,请在切换到Java 11后仔细检查它。


我仍然不明白为什么会发生这种情况。使用的区域设置没有改变,是吗?为什么在Java版本之间相同区域设置的小数分隔符会改变呢? - gsl
@gsl 因为他们更改了区域设置数据(包括小数分隔符) - 9ilsdx 9rvj 0lo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接