accounting-js vs d3-format vs format-number vs mathjs vs numeral vs sprintf-js
JavaScript 数字与货币格式化方案深度对比
accounting-jsd3-formatformat-numbermathjsnumeralsprintf-js类似的npm包:

JavaScript 数字与货币格式化方案深度对比

这些库旨在将原始数值转换为人类可读的字符串格式,涵盖货币符号、千位分隔符、百分比及科学计数法等场景。d3-formatmathjs 是目前维护活跃的主流选择,分别侧重于数据可视化精度和复杂数学运算后的格式化。accounting-jsnumeral 属于早期经典库,但目前已停止维护。sprintf-js 侧重于 C 风格字符串插值,而 format-number 则提供轻量级的基础格式支持。

npm下载趋势

3 年

GitHub Stars 排名

统计详情

npm包名称
下载量
Stars
大小
Issues
发布时间
License
accounting-js011946.9 kB121 年前MIT
d3-format064442.3 kB168 个月前ISC
format-number049-69 年前BSD-3-Clause
mathjs015,0719.43 MB2085 个月前Apache-2.0
numeral09,702-3449 年前MIT
sprintf-js02,13839.9 kB633 年前BSD-3-Clause

JavaScript 数字格式化库:架构选型与实战对比

在前端开发中,将原始数值转换为用户友好的格式(如货币、百分比、千位分隔)是常见需求。虽然现代浏览器提供了原生 Intl.NumberFormat API,但在处理复杂场景、旧浏览器兼容或特定生态系统(如 D3)时,第三方库仍有其价值。本文将深度对比 accounting-jsd3-formatformat-numbermathjsnumeralsprintf-js,帮助你做出架构决策。

⚠️ 维护状态与生命周期:首要考量

在选择库之前,必须了解其维护状态。使用已停止维护的库会引入安全风险和技术债务。

numeralaccounting-js 属于早期经典库,但目前已进入停止维护状态。

  • numeral 最后更新停留在数年前,社区已普遍建议迁移。
  • accounting-js 功能单一,多年无版本迭代。

d3-formatmathjs活跃维护的库。

  • d3-format 作为 D3 生态的一部分,更新频繁,稳定性高。
  • mathjs 持续更新,适合科学计算场景。

sprintf-jsformat-number 处于稳定期

  • 功能成熟,变更较少,适合特定用途。

💡 建议:除非维护旧系统,否则避免在新项目中使用 numeralaccounting-js

💰 货币格式化实战:语法与灵活性

货币格式化是最常见的需求,涉及符号、千位分隔和小数位数。

accounting-js 提供专用的货币函数,API 非常直观。

import accounting from 'accounting-js';

// 格式化为货币
const money = accounting.formatMoney(1234567.89, '$', 2);
// 输出:$1,234,567.89

d3-format 使用格式说明符字符串,灵活性极高。

import { format } from 'd3-format';

// 定义格式:美元,千位分隔,2 位小数
const usd = format('$,.2f');
const money = usd(1234567.89);
// 输出:$1,234,567.89

numeral 使用链式调用和模板字符串(已弃用,仅作对比)。

import numeral from 'numeral';

// 链式格式化
const money = numeral(1234567.89).format('$0,0.00');
// 输出:$1,234,567.89

mathjs 主要通过配置对象控制精度,货币符号需手动处理。

import { format } from 'mathjs';

// 控制精度,符号需自行拼接
const num = format(1234567.89, { precision: 2 });
const money = '$' + num.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
// 输出:$1,234,567.89 (需额外处理千位符)

sprintf-js 使用 C 风格占位符,不直接支持货币符号。

import sprintf from 'sprintf-js';

// 仅处理数字结构,符号需手动添加
const num = sprintf('%0,.2f', 1234567.89);
const money = '$' + num;
// 输出:$1,234,567.89

format-number 提供简单的选项对象配置。

import formatNumber from 'format-number';

// 通过配置对象控制
const formatter = formatNumber({ style: 'currency', currency: 'USD' });
const money = formatter(1234567.89);
// 输出:$1,234,567.89 (依赖底层实现)

🎯 精度控制与舍入行为

不同库对小数舍入的处理方式不同,这在金融场景中至关重要。

d3-format 支持多种舍入类型(如向上、向下、最近)。

import { formatRound } from 'd3-format';

// 强制四舍五入
const round = formatRound('.2f');
console.log(round(1.235)); // 1.24

mathjs 允许指定有效数字位数,适合科学计算。

import { format } from 'mathjs';

// 指定有效数字精度
console.log(format(12345, { precision: 3 })); // 1.23e+4

numeral 默认四舍五入,但配置项有限。

import numeral from 'numeral';

console.log(numeral(1.235).format('0.00')); // 1.24

accounting-js 默认四舍五入,可配置精度。

import accounting from 'accounting-js';

console.log(accounting.formatMoney(1.235, '', 2)); // 1.24

sprintf-js 遵循标准 C 库舍入规则。

import sprintf from 'sprintf-js';

console.log(sprintf('%.2f', 1.235)); // 1.24

format-number 通常封装了原生行为,配置较简单。

import formatNumber from 'format-number';

const formatter = formatNumber({ round: 2 });
console.log(formatter(1.235)); // 1.24

🧩 通用性与生态系统集成

除了数字格式化,库的通用性和与其他工具的集成能力也是考量点。

d3-format 是数据可视化领域的标准。

  • d3-scaled3-axis 无缝配合。
  • 适合图表标签、坐标轴格式化。

mathjs 是数学计算的全能工具。

  • 支持表达式解析、矩阵、复数。
  • 格式化只是其众多功能之一。

sprintf-js 专注于字符串插值。

  • 适合日志输出、动态消息生成。
  • 不局限于数字,可格式化日期、对象。

numeral / accounting-js / format-number 专注于数字。

  • 功能单一,集成成本低,但扩展性弱。

📊 总结对比表

特性d3-formatmathjssprintf-jsnumeralaccounting-jsformat-number
维护状态✅ 活跃✅ 活跃✅ 稳定❌ 停止维护❌ 停止维护⚠️ 低频
主要用途数据可视化科学计算字符串插值通用格式化货币格式化轻量格式化
API 风格格式说明符配置对象C 风格占位符链式调用专用函数配置对象
包体积极小极小
推荐指数⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐❌ 不推荐❌ 不推荐⭐⭐

💡 架构师建议

首选方案:对于大多数现代前端项目,优先使用原生 Intl.NumberFormat。它无需依赖,支持所有主流浏览器,且性能最佳。

特定场景选择

  • 数据可视化:选择 d3-format。它与图表库配合最好,格式控制最精细。
  • 复杂数学计算:选择 mathjs。如果你已经用它做计算,顺便用它格式化可以减少依赖。
  • 日志与模板:选择 sprintf-js。当你需要类似后端的字符串格式化逻辑时。
  • 旧项目维护:如果现有代码大量使用 numeralaccounting-js,建议制定计划迁移至 d3-format 或原生 API,以避免未来兼容性风险。

最终结论:库的选择应基于项目具体需求。不要为了简单的数字格式化引入重型库(如 mathjs),也不要在新项目中使用已停止维护的库(如 numeral)。保持依赖精简,优先利用原生能力。

如何选择: accounting-js vs d3-format vs format-number vs mathjs vs numeral vs sprintf-js

  • accounting-js:

    适合维护旧项目,它提供了开箱即用的货币格式化功能,代码简单直观。但由于已多年未更新,缺乏对现代 locale 标准的支持,不建议在新架构中引入。

  • d3-format:

    如果你正在构建数据可视化应用或需要极高的格式控制精度,这是首选。它维护活跃,支持复杂的格式说明符,且与 D3 生态系统无缝集成。

  • format-number:

    适用于只需要简单数字分隔且不希望引入重型依赖的场景。它的 API 直观,但功能相对基础,适合轻量级工具库。

  • mathjs:

    仅当你已经需要用到其强大的数学计算功能(如矩阵运算、单位转换)时才选择它。单纯为了格式化而引入它会导致包体积过大,得不偿失。

  • numeral:

    该库已正式停止维护,存在潜在的安全和兼容性风险。严禁在新项目中使用,现有项目应计划迁移至 d3-format 或原生 Intl.NumberFormat

  • sprintf-js:

    当你需要类似 C 语言 printf 的字符串插值功能时使用,不仅仅是数字,还包括日期、对象等。它适合日志格式化或复杂模板字符串构建。

accounting-js的README

NPM version

accounting-js is a tiny JavaScript library for number, money and currency parsing/formatting. It's lightweight, fully localizable, has no dependencies, and works great client-side or server-side. Use standalone or as a nodeJS/npm and AMD/requireJS module.

Documentation

Quickstart

Install

npm install accounting-js

Use

Format number

import { formatNumber } from 'accounting-js';

// Default usage
formatNumber(5318008);
// ⇨ 5,318,008

// Custom format
formatNumber(9876543.21, { precision: 3, thousand: " " });
// ⇨ 9 876 543.210

Format money

import { formatMoney } from 'accounting-js';

// Default usage
formatMoney(12345678);
// ⇨ $12,345,678.00

// European formatting (custom symbol and separators)
formatMoney(4999.99, { symbol: "€", precision: 2, thousand: ".", decimal: "," });
// ⇨ €4.999,99

Convert money to numeric

import { unformat } from 'accounting-js';

unformat('£ 12,345,678.90 GBP');
// ⇨ 12345678.9

Accounting toFixed()

// Native toFixed has rounding issues
(0.615).toFixed(2);
// ⇨ '0.61'

// With accounting-js
toFixed(0.615, 2);
// ⇨ '0.62'

Copyright (c) 2016-present Stanislav Lesnikov, MIT License

Copyright (c) 2014 Open Exchange Rates, MIT License