Intl.Collat​​or和带数字选项的自然排序使用十进制数字排序错误

时间:2016-10-18 11:54:59

标签: javascript ecmascript-intl

使用Intl.Collator对十进制数进行排序,启用numeric的选项会错误地比较小数。

在某些浏览器中,比较“0.005”和“0.05”会返回“0”,因为数字相同。

不同浏览器的结果:

  • Chrome 54 = 0
  • Firefox 49 = 0
  • Edge = -1
  • IE 11 = -1

// Returns 0
console.log(new Intl.Collator(undefined, { numeric: true}).compare(0.000005, 0.05))

任何可以告诉我什么不对的人?

在Firefox中报告为错误:https://bugzilla.mozilla.org/show_bug.cgi?id=1312388

1 个答案:

答案 0 :(得分:2)

正如AndréBargull在the Firefox bug report中观察到的那样,数字排序仅考虑 十进制数字序列,即数字的Unicode类别中的数字值。也就是说,当比较包含十进制数的两个相同的字符串和小数部分时,整数十进制数不考虑其数值 - 因为U + 002E FULL STOP不在数字类别中(而是在标点符号中)类)。

那么,当我们比较这两个字符串 - “0.05”和“0.000005”时 - 我们有效地比较了这些元素数组:

["0", ".", "05"]
["0", ".", "000005"]

然后当数字序列被数字值考虑时,我们正在比较

[0, ".", 5]
[0, ".", 5]

是相等的,所以compare在比较它们时应该返回0。 Firefox和Chrome就在这里,IE和Edge是错误的。