如果我在浏览器和节点中运行此代码,我会得到两个不同的结果:
const moneyFormatter = new Intl.NumberFormat('it-IT', {
style: 'currency',
currency: 'EUR',
minimumFractionDigits: 2
});
moneyFormatter.format(1);
浏览器:1,00 €
Node: €1.00
ICU 和节点
这个问题是由于缺少ICU http://site.icu-project.org/默认 Node 构建中的数据。
Nodejs 文档很好地解释了国际化功能的工作原理 https://nodejs.org/api/intl.html:
Node.js(及其底层 V8 引擎)使用 ICU 在本机 C/C++ 代码中实现这些功能。然而,其中一些需要非常大的 ICU 数据文件才能支持世界上所有区域设置。
同时,它解释了默认 Node 构建中的限制:
由于预计大多数 Node.js 用户将仅使用 ICU 功能的一小部分,因此 Node.js 默认情况下仅提供完整 ICU 数据集的子集。
And so:
在构建或运行 Node.js 时,提供了多个选项用于自定义和扩展 ICU 数据集。
快速解决方案
安装full-icu
npm 包,你就完成了:每个语言环境都将被安装并在你的代码中可用。只需使用指向 icu 数据集安装路径的专用环境变量启动您的应用程序即可:
NODE_ICU_DATA=node_modules/full-icu node YOURAPP.js
或者,使用特定的 Node 选项:
node --icu-data-dir=node_modules/full-icu YOURAPP.js
该解决方案的唯一缺点是完整 icu 数据集所需的空间:~27Mb。
缓慢但空间优化的解决方案
从源代码编译节点仅与特定 ICU 捆绑 https://github.com/nodejs/node/blob/master/BUILDING.md#build-with-a-specific-icu.
检查可用的区域设置
Intl.NumberFormat.supportedLocalesOf('it')
它返回一个空数组[]
如果不支持区域设置。
它返回一个带有区域设置 id 的数组['it']
如果支持区域设置。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)