Locale locale = new Locale("ar", "AE");
NumberFormat format = NumberFormat.getNumberInstance(locale);
System.out.println(format.parse("55-"));
上面的代码用 JDK 8 返回 -55,用 11 返回 55。同时 format.parse("-55") 抛出 parseException。知道为什么会发生这种变化吗?如何使用 Java 11 解析阿拉伯语 (RTL) 中的负数?
从 Java 9 开始,JDK 优先处理 CLDR locale 数据。 (Unicode 通用语言环境数据存储库)
如果你想获得 Java 8 中的行为,你可以使用命令行参数 -Djava.locale.providers=COMPAT,SPI,CLDR
有了这个,它将使用旧的“COMPAT”区域设置数据,并且如果 COMPAT 没有您的区域设置的区域设置数据,则只使用 SPI 或 CLDR。
https://www.oracle.com/java/technologies/javase/9-relnotes.html#JDK-8008577
同样的 java 更改也会影响在瑞典解析负数,在德国解析一周的第一天,可能还有很多其他事情。