Intl.NumberFormat.prototype.formatRangeToParts()

Baseline 2023
新推出

自 2023 年 8 月起,此功能已在最新的设备和浏览器版本中可用。此功能可能不适用于旧设备或浏览器。

formatRangeToParts() 方法是 Intl.NumberFormat 实例的一个方法,它返回一个包含特定于语言环境的令牌的 Array。通过这些令牌,可以构建自定义字符串,同时保留特定于语言环境的部分。这使得提供符合语言环境习惯的自定义数字范围格式成为可能。

语法

js
formatRangeToParts(startRange, endRange)

参数

startRange

要格式化的 NumberBigInt 或字符串。字符串的解析方式与 数字转换 中的方式相同,但 formatRangeToParts() 会使用字符串表示的精确值,避免在隐式转换为数字时丢失精度。

endRange

要格式化的 NumberBigInt 或字符串。

返回值

一个包含格式化范围部分的 Array。每个对象都有三个属性:typevaluesource,每个属性都包含一个字符串。按顺序连接 value 属性的字符串,将得到与调用 formatRange() 相同的结果。type 的值可能与 formatToParts() 的值相同,或者还有一个额外的值 "approximatelySign"(见下文)。source 可以是以下值之一:

startRange

该令牌是起始数字的一部分。

endRange

该令牌是结束数字的一部分。

shared

该令牌在起始和结束数字之间共享;例如,货币符号。范围模式本身的所有文字字符,例如 "–" 分隔符,也被标记为 shared

如果起始和结束数字格式化为相同的字符串,则输出的令牌列表与对起始数字调用 formatToParts() 相同,所有令牌都标记为 source: "shared"。此外,第一个令牌可能是一个“近似等于”符号(例如 “~”),其 type: "approximatelySign"。此符号的插入仅取决于语言环境设置,即使 startRange === endRange 也会插入。

异常

RangeError

如果 startRangeendRangeNaN 或无法转换的字符串,则抛出此错误。

TypeError

如果 startRangeendRangeundefined,则抛出此错误。

示例

使用 formatRangeToParts()

formatRange() 方法输出本地化的、不透明的字符串,这些字符串无法直接进行操作。

js
const startRange = 3500;
const endRange = 9500;

const formatter = new Intl.NumberFormat("de-DE", {
  style: "currency",
  currency: "EUR",
});

console.log(formatter.formatRange(startRange, endRange));
// "3.500,00–9.500,00 €"

然而,在许多用户界面中,您可能希望自定义此字符串的格式,或者将其与其他文本交织在一起。formatRangeToParts() 方法以部分的形式生成相同的信息。

js
console.log(formatter.formatRangeToParts(startRange, endRange));

// return value:
[
  { type: "integer", value: "3", source: "startRange" },
  { type: "group", value: ".", source: "startRange" },
  { type: "integer", value: "500", source: "startRange" },
  { type: "decimal", value: ",", source: "startRange" },
  { type: "fraction", value: "00", source: "startRange" },
  { type: "literal", value: "–", source: "shared" },
  { type: "integer", value: "9", source: "endRange" },
  { type: "group", value: ".", source: "endRange" },
  { type: "integer", value: "500", source: "endRange" },
  { type: "decimal", value: ",", source: "endRange" },
  { type: "fraction", value: "00", source: "endRange" },
  { type: "literal", value: " ", source: "shared" },
  { type: "currency", value: "€", source: "shared" },
];

规范

规范
ECMAScript® 2026 国际化 API 规范
# sec-intl.numberformat.prototype.formatrangetoparts

浏览器兼容性

另见