金钱喜欢有序:如何在 JavaScript 中将数字变成漂亮的标价?
想象一下:你正在编写一个在线商店。服务器返回商品价格——只是一个数字 1999.5。向用户展示“原始”数字是不礼貌的。客户希望看到 "$1,999.50",或者如果你在俄罗斯,看到 "1 999,50 ₽"。
这个问题困扰着 Stack Overflow 上的成千上万名开发者。今天,我们将一劳永逸地弄清楚如何在 JavaScript 中正确地将数字格式化为货币字符串。你将了解内置方法、它们的特性以及何时使用哪种方法最好。
为什么简单的 .toFixed(2) 是个坏主意?
许多新手会这样做:
const price = 1999.5;console.log('$' + price.toFixed(2)); // "$1999.50"看起来好像能用。但这可是一颗定时炸弹。为什么?
- 没有千位分隔符。 $1999.50 的可读性不如 $1,999.50。
- 没有本地化。 在欧洲,逗号是小数点分隔符,点是千位分隔符。你的代码会出错。
- 货币符号被硬编码。 要把 $ 换成 € 就得修改代码。
幸运的是,现代 JavaScript 为我们提供了优雅的工具。让我们来学习它们。
方法 #1:Intl.NumberFormat —— 格式化之王(推荐)
这个对象是 Internationalization API 的一部分。它专为处理区域设置、货币和数字而设计。这是最正确、最灵活的方法。
基本示例
const formatter = new Intl.NumberFormat('ru-RU', { style: 'currency', currency: 'RUB'});
console.log(formatter.format(1999.5)); // "1 999,50 ₽"搞定!JavaScript 自动添加了空格、逗号和卢布符号。很神奇,对吧?
它是如何工作的?
构造函数接受两个参数:
- locales —— 区域设置代码字符串(例如
'en-US'、'de-DE'、'ru-RU')。 - options —— 配置对象。关键是:
style: 'currency'和currency: 'USD'。
配置任意货币
想要美国的美元?
const usFormatter = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD'});console.log(usFormatter.format(2500)); // "$2,500.00"想要德国的欧元?
const deFormatter = new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR'});console.log(deFormatter.format(2500)); // "2.500,00 €"请注意:在德国,点是千位分隔符,逗号是小数点。Intl 会为你处理一切。
其他选项
想要去掉小数部分(没有分币)?
const formatter = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', minimumFractionDigits: 0, maximumFractionDigits: 0});console.log(formatter.format(1999.5)); // "$2,000" (已四舍五入)需要始终显示 4 位小数?没问题:
const preciseFormatter = new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', minimumFractionDigits: 4});console.log(preciseFormatter.format(1.2)); // "$1.2000"优点: 原生、快速、支持世界上所有货币、易于更改区域设置。
缺点: 在非常旧的浏览器中无法使用(IE 10 及以下——但这已经是历史了)。
方法 #2:Number.prototype.toLocaleString() —— 快速简单
这个方法是 Intl.Num