由于字节表示不同,来自 NumberFormat 的字符串文字和字符串的等于失败
Equals over String literal and String coming from NumberFormat fails due to different byte representation
我在玩 Java 9 的产品代码。我发现有几个格式化测试失败了。
经过一些研究,我能够创建一个 class 来重现该问题。这发生在 Java 9 而不是 Java 8.
class在这里
https://pastebin.com/87sA5WMb
import java.text.*;
import java.util.*;
public class FormatFails {
public static void main(String... args){
Currency currency = Currency.getInstance("EUR");
NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance(Locale.FRANCE);
currencyFormatter.setMaximumFractionDigits(0);
currencyFormatter.setMinimumFractionDigits(0);
currencyFormatter.setCurrency(currency);
String expected = "123 457 €";
String obtained = currencyFormatter.format(123456.789);
System.out.println(expected);
System.out.println(obtained);
System.out.println(expected.equals(obtained));
System.out.format("Bytes from expected: %s\n",Arrays.toString(expected.getBytes()));
System.out.format("Bytes from obtained: %s\n",Arrays.toString(obtained.getBytes()));
}
}
基本上比较 2 个字符串:
- 一个字符串文字和
- Locale.FRANCE 中使用 NumberFormat
生成的格式化字符串
对两者都使用 equals 失败,原因如下:
123 457 €
123 457 €
false
Bytes from expected: [49, 50, 51, -62, -96, 52, 53, 55, 32, -30, -126, -84]
Bytes from obtained: [49, 50, 51, -62, -96, 52, 53, 55, -62, -96, -30, -126, -84]
如您所见,有不同的字节数和不同的表示形式。我不知道如何解决这个问题,更重要的是 Java9 中影响代码的更改。
使用普通旧 Java 8 的结果如下:
123 457 €
123 457 €
true
Bytes from expected: [49, 50, 51, -62, -96, 52, 53, 55, 32, -30, -126, -84]
Bytes from obtained: [49, 50, 51, -62, -96, 52, 53, 55, 32, -30, -126, -84]
Java 使用了 9 个版本
java version "9"
Java(TM) SE Runtime Environment (build 9+181)
Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)
这是可用的最新版本。
JDK 9 已默认使用 CDLR 语言环境数据。可以在 JDK 9 发行说明(参见 http://jdk.java.net/9/release-notes#JDK-8008577)中找到 JEP 的链接和更多相关信息。发行说明和 JEP 记录系统 属性 您可以用来配置 JDK 以在需要时使用遗留 JRE 语言环境数据。
我在玩 Java 9 的产品代码。我发现有几个格式化测试失败了。 经过一些研究,我能够创建一个 class 来重现该问题。这发生在 Java 9 而不是 Java 8.
class在这里 https://pastebin.com/87sA5WMb
import java.text.*;
import java.util.*;
public class FormatFails {
public static void main(String... args){
Currency currency = Currency.getInstance("EUR");
NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance(Locale.FRANCE);
currencyFormatter.setMaximumFractionDigits(0);
currencyFormatter.setMinimumFractionDigits(0);
currencyFormatter.setCurrency(currency);
String expected = "123 457 €";
String obtained = currencyFormatter.format(123456.789);
System.out.println(expected);
System.out.println(obtained);
System.out.println(expected.equals(obtained));
System.out.format("Bytes from expected: %s\n",Arrays.toString(expected.getBytes()));
System.out.format("Bytes from obtained: %s\n",Arrays.toString(obtained.getBytes()));
}
}
基本上比较 2 个字符串:
- 一个字符串文字和
- Locale.FRANCE 中使用 NumberFormat 生成的格式化字符串
对两者都使用 equals 失败,原因如下:
123 457 €
123 457 €
false
Bytes from expected: [49, 50, 51, -62, -96, 52, 53, 55, 32, -30, -126, -84]
Bytes from obtained: [49, 50, 51, -62, -96, 52, 53, 55, -62, -96, -30, -126, -84]
如您所见,有不同的字节数和不同的表示形式。我不知道如何解决这个问题,更重要的是 Java9 中影响代码的更改。
使用普通旧 Java 8 的结果如下:
123 457 €
123 457 €
true
Bytes from expected: [49, 50, 51, -62, -96, 52, 53, 55, 32, -30, -126, -84]
Bytes from obtained: [49, 50, 51, -62, -96, 52, 53, 55, 32, -30, -126, -84]
Java 使用了 9 个版本
java version "9"
Java(TM) SE Runtime Environment (build 9+181)
Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)
这是可用的最新版本。
JDK 9 已默认使用 CDLR 语言环境数据。可以在 JDK 9 发行说明(参见 http://jdk.java.net/9/release-notes#JDK-8008577)中找到 JEP 的链接和更多相关信息。发行说明和 JEP 记录系统 属性 您可以用来配置 JDK 以在需要时使用遗留 JRE 语言环境数据。