在 Web 开发中,处理货币数值是一项常见但复杂的任务。JavaScript 的原生数字类型在处理货币时可能会出现精度问题,导致计算误差。为了解决这一问题,开发者需要一个专门的工具来确保货币计算的准确性和可靠性。Dinero.js 正是为此而生的一个强大库。
什么是 Dinero.js?
Dinero.js 是一个用于创建、计算和格式化货币数值的不可变 JavaScript 库。它遵循 Martin Fowler 在《企业应用架构模式》中提出的货币模式,允许开发者以对象的形式精确地存储、操作和呈现货币价值。该库支持全球所有活跃货币的定义,包括非十进制货币,如马达加斯加阿里亚里。
Dinero.js 官网:https://dinerojs.com/

Dinero.js 的特点
- 不可变性:每次操作都会返回一个新的 Dinero 对象,确保原始数据的安全性。
- 精确计算:避免了 JavaScript 浮点数计算中的精度问题,确保货币计算的准确性。
- 多货币支持:可以处理多种货币,并支持货币转换。
- 格式化选项:提供灵活的格式化选项,支持本地化显示。
- 链式操作:支持方法链式调用,简化代码结构。
如何使用 Dinero.js?
安装
您可以通过 npm 或 Yarn 安装 Dinero.js:
npm install dinero.js
# 或者
yarn add dinero.js
如果您在浏览器环境中使用,也可以直接引入 UMD 版本:
<script src="path/to/umd/dinero.js"></script>
创建 Dinero 对象
要创建一个代表货币数值的 Dinero 对象,需要提供金额(以最小货币单位表示,例如美分)和货币代码:
const { dinero, toUnit } = require('dinero.js');
const { USD } = require('@dinero.js/currencies');
const price = dinero({ amount: 5000, currency: USD }); // 代表 $50.00
执行算术操作
Dinero.js 允许对货币值进行加、减、乘、除等操作:
const { add, subtract, multiply, divide } = require('dinero.js');
const price1 = dinero({ amount: 5000, currency: USD });
const price2 = dinero({ amount: 2000, currency: USD });
const total = add(price1, price2); // $70.00
const discount = subtract(price1, price2); // $30.00
const doublePrice = multiply(price1, 2); // $100.00
const halfPrice = divide(price1, 2); // $25.00
格式化和本地化
您可以根据不同的区域设置来格式化货币显示:
const { toFormat } = require('dinero.js');
const price = dinero({ amount: 5000, currency: USD });
const formattedPrice = toFormat(price, '$0,0.00'); // 输出 "$50.00"
货币转换
Dinero.js 支持根据汇率进行货币转换:
const { convert } = require('dinero.js');
const { EUR } = require('@dinero.js/currencies');
const priceUSD = dinero({ amount: 5000, currency: USD });
const exchangeRates = { EUR: { amount: 85, scale: 2 } }; // 1 USD = 0.85 EUR
const priceEUR = convert(priceUSD, EUR, exchangeRates); // €42.50
Dinero.js 为 JavaScript 开发者提供了一个强大且精确的工具,用于处理货币数值。通过其不可变性、精确计算、多货币支持和灵活的格式化选项,开发者可以更轻松地在应用程序中进行货币操作,避免常见的计算错误。无论是电子商务平台、财务应用还是其他需要处理货币的场景,Dinero.js 都是一个值得考虑的解决方案。