我有一个简单的程序,可以计算一个双值并打印它。每当该双精度的值为负数时,输出字符串的第一个字符为\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
中,以正确地从左到右显示值,如本答案中所述