0

有示例代码(如下)。jdk@11 和 jdk@17 的执行结果不同。将 BigDecimal(1000) 格式化为字符串后,白色字符看起来有所不同。最后的结果看起来是一样的——但是,它不是同一个字符串(比较字节和 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

这是预期的行为吗?

4

1 回答 1

2

请注意,两个版本的区别在于分组分隔符(在1和之间0)在 JDK 11 中是 U+00A0(NO-BREAK SPACE),在 JDK 17 中是 U+202F(NARROW NO-BREAK SPACE)。

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

从错误报告中的讨论:

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

于 2022-01-26T15:14:17.080 回答