Intl.NumberFormat在节点和浏览器中的不同行为

时间:2019-03-15 13:32:37

标签: node.js icu

如果我在浏览器和节点中运行此代码,则会得到两个不同的结果:

const moneyFormatter = new Intl.NumberFormat('it-IT', {
    style: 'currency',
    currency: 'EUR',
    minimumFractionDigits: 2
});

moneyFormatter.format(1);

浏览器:1,00 €

节点:€1.00

1 个答案:

答案 0 :(得分:4)

ICU和节点

此问题是由默认节点版本中缺少ICU数据引起的。

Nodejs docs explain it此功能很好:

  

Node.js(及其底层V8引擎)使用ICU在本机C / C ++代码中实现这些功能。但是,其中一些需要非常大的ICU数据文件才能支持世界各地。

及其在默认节点构建中的限制:

  

由于预计大多数Node.js用户将仅使用ICU功能的一小部分,因此默认情况下,Node.js仅提供完整ICU数据集的一部分。

所以:

  

在构建或运行Node.js时提供了几个选项来自定义和扩展ICU数据集。

快速解决方案

安装full-icu npm软件包,您已完成:将安装并使用每个语言环境。只需使用专用的env变量启动您的应用程序,该变量指向icu数据集安装:

NODE_ICU_DATA=node_modules/full-icu node YOURAPP.js

或者,使用替代节点选项:

node --icu-data-dir=node_modules/full-icu YOURAPP.js

此解决方案的唯一缺点是整个icu数据集所需的空间:〜27Mb。

缓慢但空间优化的解决方案

从源bundling it with only a specific ICU编译节点。

检查可用的语言环境

Intl.NumberFormat.supportedLocalesOf('it')

如果不支持语言环境,它将返回一个空数组[]。 如果支持语言环境,它将返回一个具有语言环境ID ['it']的数组。