当前位置: 首页 > 知识库问答 >
问题:

为什么NumberFormat的工作方式不同openjdk@11和openjdk@17?

戚泰
2023-03-14

下面是示例代码。执行的结果不同于jdk@11和jdk@17.将BigDecimal(1000)格式化为字符串后,白色字符看起来有所不同。最后,结果看起来是一样的——但是,它不是相同的字符串(比较bytes和Base64.encoded)。

    import java.math.BigDecimal;
    import java.text.NumberFormat;
    import java.util.Base64;
    import java.util.Locale;

    public class NumberFormatTest {

        public static void main(String...args) {
            Locale locale = new Locale("fr", "FR");
            NumberFormat numberFormat = NumberFormat.getCurrencyInstance(locale);
            BigDecimal value = BigDecimal.valueOf(1000);

            String result = numberFormat.format(value); // <-- HERE!

            System.out.println(result);
            byte[] bytes = result.getBytes();
            for( int i=0; i<bytes.length; i++) {
                System.out.print(bytes[i]+", ");
            }
            System.out.println();
            System.out.println(Base64.getEncoder().encodeToString(bytes));
        }

    }

jdk@11的结果不同于jdk@17

jdk@11结果:

1 000,00 €
49, -62, -96, 48, 48, 48, 44, 48, 48, -62, -96, -30, -126, -84, 
McKgMDAwLDAwwqDigqw=

jdk@17结果:

1 000,00 €
49, -30, -128, -81, 48, 48, 48, 44, 48, 48, -62, -96, -30, -126, -84, 
MeKArzAwMCwwMMKg4oKs

jdk@11:

openjdk version "11.0.12" 2021-07-20
OpenJDK Runtime Environment Homebrew (build 11.0.12+0)
OpenJDK 64-Bit Server VM Homebrew (build 11.0.12+0, mixed mode)

jdk@17:

openjdk version "17.0.1" 2021-10-19
OpenJDK Runtime Environment Homebrew (build 17.0.1+1)
OpenJDK 64-Bit Server VM Homebrew (build 17.0.1+1, mixed mode, sharing)

系统:

MacOS
Catalina 10.15.7

这是预期行为吗?

共有1个答案

狄兴业
2023-03-14

请注意,这两个版本之间的区别在于,分组分隔符(在10之间)在JDK 11中是u00a0(无中断空间),在JDK 17中是u202f(窄无中断空间)。

这是预期的行为。请参阅此已解决为“无问题”的错误报告。

从bug报告中的讨论来看:

CLDR已将v34中法语的分组分隔符从U 00A0更改为U 202F:https://www.unicode.org/cldr/charts/34/delta/fr.html#SymbolsJDK基于v35。1自[JDK 13]b21起

 类似资料:
  • 这是来自Docker官方最佳实践的建议

  • 按照https://openjfx.io/openjfx-docs/#安装-javafx https://openjfx.io/openjfx-docs/#安装-javafx的说明,我通过以下方式编译了示例hellofx.java: 我有错误: 错误:找不到模块:javafx.controls 1错误 然后按照指令添加行:javac--module-path$path_to_fx--add mod

  • 问题内容: 对于Linux发行版,有一个openjdk-8-jre软件包,仅用于安装openjdk 8的jre部分。最新的Windows openjdk 11是否熟悉?可以从http://jdk.java.net/11/下载最新的openjdk版本,但是我找不到仅下载jre部分的方法。 问题答案: 我们不随JDK 11提供单独的JRE下载。相反,您可以使用jlink创建仅包含应用程序所需模块集的自

  • 我很难让IntelJ识别JavaFX包。对于一个新的JavaFX项目,使用OpenJDK11,当尝试构建项目时,IntelliJ无法识别JavaFX包。 我已经从Maven repo导入了。 我看过其他问题,解决方案似乎包括检查字节码是否处于正确的级别(我的是),项目语言是否正确(我的是)。 编辑: 错误:

  • Java11被宣布为最新的LTS版本。因此,我们正在尝试基于这个Java版本启动新的服务。 但是,Java11的基本Docker映像要比Java8的等效映像大得多: > :84 MB :283 MB (我只考虑官方的OpenJDK和每个Java版本的最轻量级映像。) 更深一层的挖掘,揭开了以下“事情”: 安装在映像中的包比(在运行的Docker容器内)大3倍: > : : 深入研究之后,我发现了这

  • 当我安装netbeans时,它给了我选择java环境的选项,我有3个选项,oracle java和这两个(java-1.7.0-openjdk-i386和java-7-openjdk-i386)。这两个有什么区别呢?操作系统如果Ubuntu。