'compact'是唯一能生成“1.2B”类缩写的notation选项,必须配合locale和compactDisplay: 'short'使用,否则可能回退为长格式或标准格式,且不支持自定义缩写词。

notation: 'compact' 是唯一可行方案
Intl.NumberFormat 的 notation 选项中,只有 'compact' 能生成 “1.2B” 这类缩写。其他值如 'standard'、'scientific'、'engineering' 都不会触发单位替换(K/M/B/T),它们只控制数字格式本身。
-
notation: 'compact'必须配合locale使用,否则可能降级为标准格式(尤其在 Node.js 早期版本或某些无 ICU 构建中) - 不支持自定义缩写词(比如把 “B” 改成 “bil” 或 “G” 表示十亿),完全依赖 locale 内置规则
- 缩写层级由数值大小和 locale 共同决定:例如
en-US下 1_000_000_000 → “1B”,而zh-CN下同值是 “10亿”
必须显式设置 compactDisplay 才能稳定输出 B/K/M
仅设 notation: 'compact' 不够,浏览器或运行时可能默认用长格式(如 “1 billion”)。要强制显示字母缩写,必须加 compactDisplay: 'short':
new Intl.NumberFormat('en-US', {
notation: 'compact',
compactDisplay: 'short' // 关键!缺它可能出 "1 billion" 而非 "1B"
}).format(1200000000)
// → "1.2B"
-
compactDisplay: 'long'会返回完整单词(“billion”、“million”),不是目标效果 - 某些 locale(如
de-DE)对'short'支持不一致,建议开发时实测目标 locale 输出
小数位数受 maximumFractionDigits 控制,但受 compact 单位影响
maximumFractionDigits 控制的是“缩写后”的小数位,不是原始数值精度。例如:
const fmt = new Intl.NumberFormat('en-US', {
notation: 'compact',
compactDisplay: 'short',
maximumFractionDigits: 1
});
<p>fmt.format(999_999) // → "1M"(不是 "1.0M":因进位后整数单位,不补小数)
fmt.format(1_234_567) // → "1.2M"(1234567 → 1.234567M → 四舍五入到 1.2M)
fmt.format(999_499) // → "999K"(未跨单位,保留三位有效数字逻辑)</p>- 它不会强制显示小数点;
1000000总是 “1M”,哪怕设了maximumFractionDigits: 2 - 若需统一补零(如 “1.0M”),得手动后处理字符串,
Intl.NumberFormat不提供该能力
注意 Safari 和旧版 Chrome 的兼容性陷阱
iOS Safari 14+、Chrome 90+ 支持完整 compact,但:
- Safari 13 及更早:忽略
notation: 'compact',静默回退为 standard 格式 - Android WebView(基于旧 Chromium)可能无 ICU 数据,导致
format()抛RangeError: Invalid language tag或返回空字符串 - Node.js 需启用 full-icu(如通过
node --icu-data-dir=...)或使用官方full-icu包,否则en-US以外的 locale 可能失效
验证是否可用的最小检查:
try {
const test = new Intl.NumberFormat('en-US', { notation: 'compact' }).format(1e6);
if (!/K|M|B|T/.test(test)) throw 0;
} catch {
// fallback to manual formatting
}
locale 和 compactDisplay 的组合行为在不同引擎间仍有细微差异,真实项目里别只靠文档,一定拿真机 + 真用户 locale 测。

















