您可能已经熟悉 Intl.NumberFormat
API,因为它在现代环境中已经支持了一段时间。
- Chrome: 自版本 24 起支持
- Firefox: 自版本 29 起支持
- Safari: 自版本 10 起支持
- Node.js: 自版本 0.12 起支持
- Babel: 支持
在最基本的形式中,Intl.NumberFormat
允许您创建一个可重用的格式化程序实例,该实例支持区域感知的数字格式化。与其他 Intl.*Format
API 一样,格式化程序实例支持 format
和 formatToParts
方法。
const formatter = new Intl.NumberFormat('en');
formatter.format(987654.321);
// → '987,654.321'
formatter.formatToParts(987654.321);
// → [
// → { type: 'integer', value: '987' },
// → { type: 'group', value: ',' },
// → { type: 'integer', value: '654' },
// → { type: 'decimal', value: '.' },
// → { type: 'fraction', value: '321' }
// → ]
注意:虽然 Intl.NumberFormat
的大部分功能可以通过 Number.prototype.toLocaleString
实现,但 Intl.NumberFormat
通常是更好的选择,因为它可以创建可重用的格式化程序实例,这往往 更高效。
最近,Intl.NumberFormat
API 获得了一些新功能。
BigInt
支持 #
除了 Number
之外,Intl.NumberFormat
现在还可以格式化 BigInt
const formatter = new Intl.NumberFormat('fr');
formatter.format(12345678901234567890n);
// → '12 345 678 901 234 567 890'
formatter.formatToParts(123456n);
// → [
// → { type: 'integer', value: '123' },
// → { type: 'group', value: ' ' },
// → { type: 'integer', value: '456' }
// → ]
- Chrome: 自版本 76 起支持
- Firefox: 不支持
- Safari: 不支持
- Node.js: 不支持
- Babel: 不支持
计量单位 #
Intl.NumberFormat
目前支持以下所谓的简单单位
- 角度:
degree
- 面积:
acre
、hectare
- 浓度:
percent
- 数字:
bit
、byte
、kilobit
、kilobyte
、megabit
、megabyte
、gigabit
、gigabyte
、terabit
、terabyte
、petabyte
- 持续时间:
millisecond
、second
、minute
、hour
、day
、week
、month
、year
- 长度:
millimeter
、centimeter
、meter
、kilometer
、inch
、foot
、yard
、mile
、mile-scandinavian
- 质量:
gram
、kilogram
、ounce
、pound
、stone
- 温度:
celsius
、fahrenheit
- 体积:
liter
、milliliter
、gallon
、fluid-ounce
要使用本地化的单位格式化数字,请使用 style
和 unit
选项
const formatter = new Intl.NumberFormat('en', {
style: 'unit',
unit: 'kilobyte',
});
formatter.format(1.234);
// → '1.234 kB'
formatter.format(123.4);
// → '123.4 kB'
请注意,随着时间的推移,可能会添加对更多单位的支持。请参阅规范以获取 最新更新的列表。
以上简单单位可以组合成任意分子和分母对,以表示复合单位,例如“升/英亩”或“米/秒”。
const formatter = new Intl.NumberFormat('en', {
style: 'unit',
unit: 'meter-per-second',
});
formatter.format(299792458);
// → '299,792,458 m/s'
- Chrome: 自版本 77 起支持
- Firefox: 不支持
- Safari: 不支持
- Node.js: 不支持
- Babel: 不支持
紧凑型、科学型和工程型记数法 #
紧凑型记数法使用区域特定的符号来表示大数。它是科学记数法的更人性化的替代方案。
{
// Test standard notation.
const formatter = new Intl.NumberFormat('en', {
notation: 'standard', // This is the implied default.
});
formatter.format(1234.56);
// → '1,234.56'
formatter.format(123456);
// → '123,456'
formatter.format(123456789);
// → '123,456,789'
}
{
// Test compact notation.
const formatter = new Intl.NumberFormat('en', {
notation: 'compact',
});
formatter.format(1234.56);
// → '1.2K'
formatter.format(123456);
// → '123K'
formatter.format(123456789);
// → '123M'
}
注意:默认情况下,紧凑型记数法四舍五入到最接近的整数,但始终保留 2 位有效数字。您可以设置任何 {minimum,maximum}FractionDigits
或 {minimum,maximum}SignificantDigits
来覆盖该行为。
Intl.NumberFormat
也可以将数字格式化为 科学记数法
const formatter = new Intl.NumberFormat('en', {
style: 'unit',
unit: 'meter-per-second',
notation: 'scientific',
});
formatter.format(299792458);
// → '2.998E8 m/s'
工程记数法 也受支持。
const formatter = new Intl.NumberFormat('en', {
style: 'unit',
unit: 'meter-per-second',
notation: 'engineering',
});
formatter.format(299792458);
// → '299.792E6 m/s'
- Chrome: 自版本 77 起支持
- Firefox: 不支持
- Safari: 不支持
- Node.js: 不支持
- Babel: 不支持
符号显示 #
在某些情况下(例如显示增量),即使数字为正,显式显示符号也很有帮助。新的 signDisplay
选项可以实现这一点。
const formatter = new Intl.NumberFormat('en', {
style: 'unit',
unit: 'percent',
signDisplay: 'always',
});
formatter.format(-12.34);
// → '-12.34%'
formatter.format(12.34);
// → '+12.34%'
formatter.format(0);
// → '+0%'
formatter.format(-0);
// → '-0%'
要防止在值为 0
时显示符号,请使用 signDisplay: 'exceptZero'
。
const formatter = new Intl.NumberFormat('en', {
style: 'unit',
unit: 'percent',
signDisplay: 'exceptZero',
});
formatter.format(-12.34);
// → '-12.34%'
formatter.format(12.34);
// → '+12.34%'
formatter.format(0);
// → '0%'
// Note: -0 still displays with a sign, as you’d expect:
formatter.format(-0);
// → '-0%'
对于货币,currencySign
选项启用会计格式,该格式启用负货币金额的区域特定格式;例如,将金额括在括号中。
const formatter = new Intl.NumberFormat('en', {
style: 'currency',
currency: 'USD',
signDisplay: 'exceptZero',
currencySign: 'accounting',
});
formatter.format(-12.34);
// → '($12.34)'
formatter.format(12.34);
// → '+$12.34'
formatter.format(0);
// → '$0.00'
formatter.format(-0);
// → '($0.00)'
- Chrome: 自版本 77 起支持
- Firefox: 不支持
- Safari: 不支持
- Node.js: 不支持
- Babel: 不支持
更多信息 #
相关的 规范提案 包含更多信息和示例,包括有关如何检测每个 Intl.NumberFormat
功能的指南。