我可以让节点在数字字符串中输出逗号而不引入 i18n 吗?

2024-02-17

并不是说添加一个需求有什么大不了的,而是节点文档建议您不需要它: http://nodemanual.org/latest/js_doc/Number.html#Number.toLocaleString

// from the docs: 
var number = 3500;
console.log(number.toLocaleString()); // Displays "3,500" in English locale

但这种情况不会发生:

$ node
> var n = 1238909880
undefined
> n.toLocaleString() 
'1238909880'
> n.toLocaleString('en-US' )  // docs on node don't suggest this, but on MDN they do so...
'1238909880'
> process.env.LANG
'en_US.UTF-8'

我是否必须引入 i18n 才能在数字中添加逗号? Nodejs 文档中没有关于 Number.toLocaleString 的内容。我的LANG据我所知,看起来是正确的,距离也不远。尝试将 process.env.LANG 设置为“en-US”,但输出没有改变。


(等了几天其他答案)

看起来这是一个已知问题,我发现的文档不是官方的。我无法找到此行为的任何官方文档。 MDN 文档假设存在浏览器(具有 i18n)。浏览器之外的 V8 的文档很少。

https://github.com/joyent/node/issues/4689 https://github.com/joyent/node/issues/4689

bnoordhuis 评论:

这可以说是一个 V8 错误。它忽略区域设置。事实上,所有日期和数字格式化逻辑都是硬编码的。

它在 Chrome 和 Chromium 中工作的原因是这些项目在 V8 之上使用 v8-i18n。我认为这不是我们想要采取的方向。它依赖于 libicu,那是一个巨大的库。我们必须将其捆绑在一起,这将使我们已经很大的源代码树再增加 85 MB 和约 500,000 LoC。

我的解决方案是这样的(咖啡):

Number::withCommas = ->
  parts = this.toString().split(".")
  parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",")
  parts.join "."

替代解决方案:使用数字.js http://numeraljs.com。很漂亮。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以让节点在数字字符串中输出逗号而不引入 i18n 吗? 的相关文章

随机推荐