【问题标题】:DecimalFormat returns weird Character when formatting negative double格式化负双精度时,DecimalFormat 返回奇怪的字符
【发布时间】:2020-11-12 10:55:11
【问题描述】:

我有一个简单的程序,可以计算双精度值并打印出来。 每当该 double 的值为负时,输出字符串的第一个字符是 \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() 它不会发生。 在任何地方都找不到这方面的文档。

有人遇到过这种情况或者知道怎么解释吗?

【问题讨论】:

  • 我怀疑如果你使用getInstance(Locale.ENGLISH),你会得到不同的结果。

标签: java locale number-formatting left-to-right


【解决方案1】:

您将数字格式化为字符串,然后取第一个字符 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

8206left-to-right mark 的 Unicode 字符。

当 RTL 语言环境应用为 explained in this answer 时,很可能会将此字符添加到 NumberFormat / DecimalFormat 以正确从左到右显示值

【讨论】:

  • 问题是我正在操作字符串,而那个值 (8206) 不知从何而来。 '-' 还有一个 char 值,所以这不是问题。问题是一个额外的字符,它对字符串的显示没有任何作用,而只是破坏了它的阅读。
  • 默认en_US 区域设置以及任何可用区域设置(包括从右到左方向的区域设置)都无法重现您的问题。您能否提供有关您的区域设置的任何详细信息?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-14
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
相关资源
最近更新 更多