【问题标题】:can I get node to output commas in number strings without bringing in i18n?我可以让节点在不引入 i18n 的情况下输出数字字符串中的逗号吗?
【发布时间】:2013-07-29 22:57:00
【问题描述】:

并不是说添加 require 是什么大不了的事,而是 node docs suggest that you don't need it:

// 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 才能在我的号码中添加逗号? Number.toLocaleString 的 nodejs 文档中对此一无所知。据我所知,我的LANG 看起来是正确的,这并不遥远。尝试将 process.env.LANG 设置为 'en-US' 并且输出没有改变。

【问题讨论】:

  • 是的,官方文档是here. 不过谢谢,完全窃取了你的逗号正则表达式哈哈。

标签: node.js internationalization


【解决方案1】:

(等了几天其他答案)

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

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 "."

替代解决方案:使用numeral.js。挺好看的。

【讨论】:

  • 查看我的其他回复。
  • 另外,请参阅问题的其余部分和引用的 PR,以及进一步的讨论。
【解决方案2】:

这将改变。致力于在节点中默认启用 Intl。见https://github.com/joyent/node/pull/7719

EDIT如果你下载node v0.12,Intl默认是开启的。

【讨论】:

  • 我有节点 6,但它在 linux 上仍然对我不起作用。但它适用于mac:/
  • @Mr.Goferito 什么不起作用? “npm install full-icu”有帮助吗?
  • 酷。仅仅通过要求它不起作用,但它给了我线索。 NODE_ICU_DATA=icudt58l.dat node ... 成功了,成为 icudl58l.dat 完整的 icu 数据文件。谢谢!
  • @Mr.Goferito 是的,一年来我一直在努力实现你想要的工作。棘手的细节是平台相关的部分......github.com/nodejs/node/issues/3460
猜你喜欢
  • 1970-01-01
  • 2015-06-08
  • 1970-01-01
  • 2011-08-19
  • 2010-09-14
  • 1970-01-01
  • 2018-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多