如何按指定模式格式化数值?求JavaScript中Java DecimalFormat等效实现
刚好我之前也折腾过类似需求,Java里的DecimalFormat确实好用,但JS里也有对应的解决办法,分两种场景给你说:
一、用原生Intl.NumberFormat(无需额外依赖)
JS原生的国际化API Intl.NumberFormat 已经能覆盖你列出的大部分格式化场景,虽然不能直接传入类似#,###.00的模式字符串,但可以通过配置参数实现完全相同的效果。下面对应你给出的每个模式,直接上代码:
模式
#,###.00:带千分位分隔符,强制保留两位小数const format1 = (num) => new Intl.NumberFormat('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2, useGrouping: true }).format(num); console.log(format1(12345.6)); // 输出 "12,345.60"模式
###.##:不带千分位,最多保留两位小数(小数部分为0时不显示)const format2 = (num) => new Intl.NumberFormat('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 2, useGrouping: false }).format(num); console.log(format2(1234.56)); // 输出 "1234.56" console.log(format2(1234)); // 输出 "1234"模式
#,###.##:带千分位,最多保留两位小数const format3 = (num) => new Intl.NumberFormat('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 2, useGrouping: true }).format(num); console.log(format3(12345.6)); // 输出 "12,345.6" console.log(format3(12345.678)); // 输出 "12,345.68"模式
$#,##0.00:带美元符号,千分位,强制两位小数const format4 = (num) => new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(num); console.log(format4(1234.5)); // 输出 "$1,234.50"模式
###,###.00/$###,###.00:这两个其实和上面的#,###.00、$#,##0.00效果一致,Intl.NumberFormat会自动处理整数部分的位数,不用额外配置:// ###,###.00 示例 console.log(format1(123456.7)); // 输出 "123,456.70" // $###,###.00 示例 console.log(format4(123456.7)); // 输出 "$123,456.70"模式
###,###.###:带千分位,最多保留三位小数const format5 = (num) => new Intl.NumberFormat('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 3, useGrouping: true }).format(num); console.log(format5(12345.6789)); // 输出 "12,345.679"模式
####,####.000:这里要注意,原生Intl.NumberFormat默认是三位一组的千分位,不支持自定义四位分组。如果确实需要这种特殊分组格式,建议用下面的第三方库方案。
二、用第三方库(支持直接传入DecimalFormat风格的模式)
如果你习惯直接用#,###.00这种字符串模式,不想写配置参数,推荐用numeral.js或者accounting.js,这两个库都完美支持类似Java的格式化语法。
以numeral.js为例,先安装(npm或yarn):
npm install numeral
然后直接用模式字符串格式化:
import numeral from 'numeral'; // 对应你列出的模式示例 console.log(numeral(1234.5).format('#,###.00')); // "1,234.50" console.log(numeral(1234).format('###.##')); // "1234" console.log(numeral(12345.678).format('#,###.##')); // "12,345.68" console.log(numeral(1234.5).format('$#,##0.00')); // "$1,234.50" console.log(numeral(123456.7).format('###,###.00')); // "123,456.70" console.log(numeral(123456.7).format('$###,###.00')); // "$123,456.70" console.log(numeral(12345.6789).format('###,###.###')); // "12,345.679" console.log(numeral(12345678.9).format('####,####.000')); // "1234,5678.900"
accounting.js的用法类似,也能直接解析这种模式字符串,看你个人偏好选择就行。
总结一下:如果只是常规格式化,原生API足够用,不用加依赖;如果需要自定义分组或者直接用模式字符串,第三方库更省心。
内容的提问来源于stack exchange,提问作者Cataclysm

