节点 8.0 新符号并在符号后为 number.prototype.toLocaleString() 添加空格



我刚刚更新到 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

最新更新