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

问题描述 投票:1回答:1

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

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

moneyFormatter.format(1);

浏览器:1,00 €

因为:kuzxsw点

node.js icu
1个回答
6
投票

智商和看

此问题是由默认节点构建中缺少€1.00数据引起的。

ICU这个功能很好:

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

它在默认节点构建中的局限性:

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

所以:

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

快速解决方案

安装Nodejs docs explain it npm软件包,您就完成了:每个语言环境都将被安装并可以使用。只需使用指向icu数据集安装的专用env var启动应用程序:

full-icu

或者,使用备用节点选项:

NODE_ICU_DATA=node_modules/full-icu node YOURAPP.js

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

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

从源node --icu-data-dir=node_modules/full-icu YOURAPP.js 编译节点。

Checking available locales

bundling it with only a specific ICU

如果不支持语言环境,它将返回一个空数组Intl.NumberFormat.supportedLocalesOf('it') 。如果支持语言环境,它将返回一个语言环境为[]的数组。

© www.soinside.com 2019 - 2024. All rights reserved.