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

我希望 Intl.NumberFormat() 根据通用规则在单位之间自动从较小的单位转换为较大的单位。 IE。给定的数字应在输出中转换为厘米、米和公里之间,具体取决于数字的大小。

代码示例:

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);

这两个调用的输出是:

1,000,000B/s
365 天

不过,在那种情况下,我希望这样:

1MB/秒
1 年

人们可能想要定义何时转换为下一个更大单位的阈值。因此,一旦达到确切的值,但也可能更早发生转换,假设在下一个更大单位的 90% 处。鉴于上面的例子,输出将是这样的:

0.9MB/秒
0.9 年

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

stack overflow Is there an option in Intl.NumberFormat() to automatically convert to bigger units?
原文答案
author avatar

接受的答案

不完全是问题的完整答案,但我想我把它放在这里以防它可以帮助任何人。

Intl.NumberFormat 实际上可以实现接近于此的结果,但它有一些限制。例如,如果你想格式化字节值,你可以:

  1. 使用 compact 符号。
  2. 使用 unit 作为你的样式,并提供 byte 作为单位。
  3. narrow 设置为 unitDisplay

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

这当然只能用于少数有意义的 supported units ,并且它限制了您将单位放在值旁边,即使这通常是您想要的。如果您需要针对较旧的平台, Browser support 也可能是一个问题。

这是一个示例。

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 documentation 中看到所有可能的选项和方法。此外,ECMAScript 的 list of supported units 包含例如 bytekilobytemegabyte 作为单独的单元。

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