我刚刚更新到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 + Chrome
'$5.00'
答案 0 :(得分:1)
看起来我得到的错误是没有提供语言环境时所以value.toLocaleString(undefined, { style: 'currency', currency: 'USD' })
。我想默认语言环境不再是en-US
因此导致了我的问题。谢谢你的帮助
答案 1 :(得分:0)
是否应将其视为基于环境而变化的功能?
是的,当然。来自ECMA-402 §13.2.1和§11.3.4:
" 计算依赖于字符串值和数字字符串中依赖于实现和有效区域设置的位置[...] "
尽管它注意到了
" 建议实现使用公共区域设置数据存储库提供的区域设置数据(可在http://cldr.unicode.org/获得)。"
答案 2 :(得分:0)
问题是由于“icu”。您正在使用的Node版本默认情况下不包含“full-icu”。我发现了两种解决问题的方法。第一个涉及在运行时给节点一个完整的icu。第二个涉及从头开始编译Node,包括full-icu。
运行时方法
假设您已安装节点8.11.1
。全局安装npm package full-icu
。
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
的选项。我建议using 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)