formatnumber 是一个可配置、可复用的数值格式化函数,支持千分位、小数位、前后缀、负号样式、科学计数法及国际化,内置输入校验、边界处理与 intl.numberformat 集成。

用 JavaScript 编写通用数值格式化工具,核心是封装可配置、可复用的函数,支持千分位、小数位、前缀/后缀、负数样式、科学计数法等常见需求,同时兼顾国际化(如不同地区的分隔符)和边界情况(如 null、NaN、无穷大)。
基础结构:一个灵活的 formatNumber 函数
定义主函数,接收数值和配置对象,返回格式化后的字符串。配置项包括:
- digits:保留小数位数(默认 0,-1 表示不四舍五入,仅截断)
-
thousands:千分位分隔符(默认
',') -
decimal:小数点符号(默认
'.') -
prefix / suffix:前后缀(如
'¥'、'%') -
negative:负号样式(如
'-'、'('或'( )') -
notation:可选
'standard'、'scientific'、'compact'
处理数字有效性与标准化
函数开头需统一校验输入:
- 非数字类型(
undefined、null、字符串非数字)转为NaN - 用
Number()转换并检查isNaN()和isFinite() - 对
Infinity和-Infinity单独返回'∞'或'-∞'(可配) - 对
0特别处理,避免-0输出负零(可用Object.is(value, -0)判断)
按 notation 分支实现格式逻辑
根据 notation 配置选择底层策略:
-
standard:手动拆解整数/小数部分,用
String#replace或正则添加千分位(如/\B(?=(\d{3})+(?!\d))/g) -
scientific:用
value.toExponential(digits),再替换小数点和指数符号(适配 locale) -
compact:需映射数量级(如 1e3 → 'K',1e6 → 'M'),注意
Intl.NumberFormat的notation: 'compact'在现代浏览器已支持,可作为 fallback 或直接使用
推荐优先使用 Intl.NumberFormat 构造器(支持 locale、currency、unit 等),再用自定义逻辑补足其不支持的场景(如自定义负号包裹、截断而非四舍五入)。
实用增强建议
让工具更易集成和扩展:
- 导出多个预设函数:如
formatCurrency、formatPercent、formatBytes,内部复用主函数 + 默认配置 - 支持 locale 字符串(如
'de-DE'),自动获取对应分隔符,但允许显式覆盖 - 提供
parseFormatted反向解析函数(移除前缀/后缀/分隔符,还原原始数字) - 对高频调用场景(如表格渲染)加 memoize 缓存(基于 value + config JSON 字符串键)











