DecimalFormat在格式化负双精度时返回怪异字符



我有一个简单的程序,可以计算一个双值并打印它。每当该双精度的值为负数时,输出字符串的第一个字符为\u200e,ASCII值8206。我在网上找不到这方面的任何信息。

System.out.println((int)DecimalFormat.getInstance().format(-1).charAt(0));
System.out.println((int)DecimalFormat.getInstance().format(-1.0).charAt(0));
System.out.println((int)NumberFormat.getInstance().format(1).charAt(0));
System.out.println((int)NumberFormat.getInstance().format(0).charAt(0));

它打印如下:

8206
8206
49
48

所以我知道每个负值都有一个奇怪的前缀,但为什么呢?如果我使用String.format(),它不会发生。在任何地方都找不到这方面的文档。

有人遇到过这种情况,或者知道如何解释?

将数字格式化为String,然后取第一个字符charAt(0),将其转换为int,然后实际打印ASCII代码。

因此,难怪代码可能会产生这样的结果:

45  // ASCII code of - in your default locale it's another character for negative values
45
49  // ASCII code of 1
48  // ASCII code of 0

8206是一个用于从左到右标记的Unicode字符。

当应用RTL区域设置时,该字符很可能被添加到NumberFormat/DecimalFormat中,以正确地从左到右显示值,如本答案中所述

最新更新