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

Seb*_*ner 11 javascript format internationalization

我想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);
Run Code Online (Sandbox Code Playgroud)

这两个调用的输出是:

1,000,000B/秒
365 天

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

1MB/秒
1 年

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

0.9MB/秒
0.9 年

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

and*_*c93 19

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

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

  1. 使用compact记号。
  2. 作为您的风格使用unit,并byte作为单位提供。
  3. 设置。narrowunitDisplay

使用这些选项,格式化程序将正确地从一种单位转换为另一种单位,并且由于该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));
Run Code Online (Sandbox Code Playgroud)

  • 这工作得很好,除了它不能处理 Chrome 或 Firefox 中的“gigabyte”或“petabyte”(不确定 Safari)。这很奇怪,因为根据 https://tc39.es/ecma402/#table,它们是有效单位-sanctioned-single-unit-identifiers 千兆字节显示为“1BB”(十亿字节?),拍字节显示为“1000TB” 不过,太字节的工作确实很奇怪。 (2认同)