Intl.NumberFormat()中是否有自动转换为更大单位的选项



我希望Intl.NumberFormat()能够根据通用规则在单位之间自动转换,从较小的单位转换为较大的单位。也就是说,一个给定的数字应该根据数字的大小在输出中转换为厘米、米和公里

代码示例:

const bytes = 1000000;
const transferSpeed = new Intl.NumberFormat('en-US',
{style: 'unit', unit: 'byte-per-second', unitDisplay: 'narrow'}).format(bytes);
console.log(transferSpeed);
const days = 365;
const timespan = new Intl.NumberFormat('en-US',
{style: 'unit', unit: 'day', unitDisplay: 'long'}).format(days);
console.log(timespan);

这两个调用的输出是:

1000000B/s
365天

在这种情况下,我预计会这样:

1MB/s
1年

可能需要定义何时转换到下一个更大单元的阈值。因此,转换可能在达到确切值后发生,但也可能更早,比如说在下一个更大单位的90%时。给定上面的例子,输出将是这样的:

0.9MB/s
0.9年

API是否有配置选项可以做到这一点?

不是这个问题的完整答案,但我想我把它放在这里是为了防止它对任何人都有帮助。

Intl.NumberFormat实际上可以实现类似的功能,但它有一些局限性。例如,如果你想格式化字节值,你可以:

  1. 使用compact表示法
  2. 使用unit作为您的风格,并提供byte作为单位
  3. narrow设置为unitDisplay

使用这些选项,格式化程序将正确地从一个单位转换到另一个单位,并且由于unitDisplay值,它将显示您所期望的测量单位。

当然,这只适用于少数支持的有意义的单位,并且它限制了您将单位放在值旁边,尽管这通常是您想要的。如果您需要针对较旧的平台,浏览器支持也可能是一个问题。

这是一个样品。

const byteValueNumberFormatter = Intl.NumberFormat("en", {
notation: "compact",
style: "unit",
unit: "byte",
unitDisplay: "narrow",
});
console.log(byteValueNumberFormatter.format(10));
console.log(byteValueNumberFormatter.format(200000));
console.log(byteValueNumberFormatter.format(50000000));

不幸的是,没有这样的功能。您可以在MDN文档中看到所有可能的选项和方法。此外,ECMAScript支持的单元列表包含例如bytekilobytemegabyte作为单独的单元。

我建议您自己实现,或者找到一个适合您需求的模块。与此同时,我搜索了ECMAScript提案,但没有找到类似的内容,所以我在讨论板上提出了一个想法。也许它会流行起来:https://es.discourse.group/t/automatic-unit-conversion-for-intl-numberformat/763

最新更新