Javascript 带数字选项的Intl.Collator和natural sort使用十进制数字进行错误排序
使用Javascript 带数字选项的Intl.Collator和natural sort使用十进制数字进行错误排序,javascript,ecmascript-intl,Javascript,Ecmascript Intl,使用Intl.Collator和启用numeric选项对小数进行排序时,小数比较不正确 在某些浏览器上,比较“0.005”和“0.05”会返回“0”,因为数字是相同的 不同浏览器中的结果: 铬54=0 Firefox 49=0 边=-1 IE 11=-1 //返回0 console.log(新的Intl.Collator(未定义,{numeric:true})。比较(0.000005,0.05))正如AndréBargull在中观察到的那样,数字排序只考虑十进制数字序列,即Unicode数
Intl.Collator
和启用numeric
选项对小数进行排序时,小数比较不正确
在某些浏览器上,比较“0.005”和“0.05”会返回“0”,因为数字是相同的
不同浏览器中的结果:
- 铬54=0
- Firefox 49=0
- 边=-1
- IE 11=-1
//返回0
console.log(新的Intl.Collator(未定义,{numeric:true})。比较(0.000005,0.05))
正如AndréBargull在中观察到的那样,数字排序只考虑十进制数字序列,即Unicode数字类别中的数字序列的数值。也就是说,当比较两个包含小数和小数成分的相同字符串时,不考虑整个小数的数值——因为U+002E句号不在数字类别中(而是在标点符号类别中)
因此,当我们比较这两个字符串--“0.05”和“0.000005”时,我们实际上是在比较这些元素数组:
["0", ".", "05"]
["0", ".", "000005"]
然后,当数字序列被它们的数值考虑时,我们比较
[0, ".", 5]
[0, ".", 5]
它们相等,因此比较它们时,
compare
应返回0。Firefox和Chrome就在这里,IE和Edge搞错了。我在Edge上得到了-1。谢谢@NinaScholz,我用我得到的不同结果更新了这个问题。