You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Intl.NumberFormat在Chrome和Safari中输出一致?

解决Intl.NumberFormat紧凑格式跨浏览器小数位数不一致问题

使用Intl.NumberFormat的compact标记格式化数字时,不同浏览器对minimumFractionDigits和maximumFractionDigits的实现存在差异,比如你遇到的Chrome输出1.55 billion,而Safari只输出1.5 billion的情况。

要实现跨浏览器一致的两位小数紧凑格式,可以手动处理数字的量级转换,避免依赖浏览器对Intl API的不同实现:

function formatCompactNumber(num) {
  // 定义en-US下的量级单位及对应基数
  const unitMap = [
    { threshold: 1e12, unit: 'trillion' },
    { threshold: 1e9, unit: 'billion' },
    { threshold: 1e6, unit: 'million' },
    { threshold: 1e3, unit: 'thousand' },
    { threshold: 1, unit: '' }
  ];

  // 匹配当前数字对应的量级
  const { threshold, unit } = unitMap.find(item => Math.abs(num) >= item.threshold);
  // 计算转换后的数值并保留两位小数
  const formattedValue = (num / threshold).toFixed(2);
  // 拼接数值和单位,去掉末尾多余空格
  return `${formattedValue} ${unit}`.trim();
}

// 测试示例
console.log(formatCompactNumber(1547150626.57)); // 输出 "1.55 billion"
console.log(formatCompactNumber(1234567.89)); // 输出 "1.23 million"
console.log(formatCompactNumber(9876.54)); // 输出 "9.88 thousand"

这个方法的核心是手动匹配数字量级、计算保留两位小数的数值,再拼接单位,完全脱离浏览器对Intl API的实现差异,确保所有环境下输出一致。如果需要支持其他语言,只需修改unitMap中的单位字符串即可。

内容的提问来源于stack exchange,提问作者GeorgeMet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 12:54:59