我刚刚更新到 Node v8.0,并注意到带有选项style: 'currency'
且currency
设置为任何货币的 Number.prototype.toLocaleString() 的行为与任何其他环境都不同。 在 Node v7.2.1 和 Chrome v58.0 中,我的输出看起来像$5.00
,但在节点 8 中,它以不同的货币符号和额外的空间显示为US$ 5.00
。这只是一个更新吗?我在哪里可以找到这方面的文档? Node 是否刚刚决定更新toLocaleString
,它应该被视为根据环境变化的功能?
const value = 5
value.toLocaleString('en-US', { style: 'currency', currency: 'USD' })
节点 8.0
'US$ 5.00'
节点<8.0 + 铬
'$5.00'
看起来我得到的错误是没有提供语言环境,所以value.toLocaleString(undefined, { style: 'currency', currency: 'USD' })
.我想默认区域设置不再en-US
,因此导致了我的问题。感谢您的帮助
是否应该将其视为根据环境而变化的函数?
是的,当然。来自 ECMA-402 §13.2.1 和 §11.3.4:
">计算依赖于数字字符串中的字符串值和位置,这些值和位置取决于实现和有效区域设置 [...]">
即使它指出
">建议实现使用通用区域设置数据存储库(可在 http://cldr.unicode.org/获得)提供的区域设置数据。
问题是由于"ICU"造成的。默认情况下,您使用的 Node 版本不包含"全 ICU"。我找到了两种解决问题的方法。第一种涉及在运行时为节点提供完整的 ICU。第二个涉及从头开始编译 Node,包括完整的 icu。
运行时方法
假设您安装了节点8.11.1
。全局full-icu
安装 npm 包。
npm install -g full-icu
阅读命令行消息以查看full-icu
文件的安装位置。当您在调用node
命令时指定 --icu-data-dir 选项时,您将需要它。例如:
node --icu-data-dir=/some/where/.nvm/versions/node/v8.11.1/lib/node_modules/full-icu Your-App.js
将Your-App.js
替换为您的程序。您也可以在本地安装full-icu
软件包,并将./nodule_modules/full-icu
用于icu-data-dir
。
参考: https://nodejs.org/dist/latest-v8.x/docs/api/intl.html#intl_providing_icu_data_at_runtime
编译方法
此方法涉及从头开始编译 Node,指定一个选项以在构建中包含full-icu
。我建议使用 NVM:
nvm use 6
nvm uninstall 8
nvm install -s v8 --with-intl=full-icu --download=all
上述内容会预先临时切换您的 Node 版本,以便您可以在安装新的 v8 之前卸载 Node 8 版本。不要跳过这一步!构建 Node 可能需要一段时间。
(如果您没有上述版本 6,请使用nvm install 6
安装它或使用与 8 不同的其他版本)
参考: https://github.com/creationix/nvm/issues/1719