想必大家在做前端开发的过程中或多或少都会需要显示数字或是金钱,或是百分数,或是小数位取有效数字。Number.parseFloat(x).toFixed(2)或许可以解决取有效数字的问题,但是其他的就没辙了。尤其是js的浮点数计算不精确导致在前端计算合适麻烦,还需要引用第三方库来解决,最后导致怕麻烦的童鞋有时候就直接叫后端直接传计算后的值^ _ ^ |||,其实官方已经提供了api去解决类似问题了,而且还是一起解决的,接下来抛转引玉大家一起来学习一下这个api,Intl !!! 去看Intl详情请戳
Intl 对象是 ECMAScript 国际化 API 的一个命名空间,它提供了精确的字符串对比、数字格式化,和日期时间格式化。Collator,NumberFormat 和 DateTimeFormat 对象的构造函数是 Intl 对象的属性。本页文档内容包括了这些属性,以及国际化使用的构造器和其他语言的方法等常见的功能。
我自己封装了一个方法去处理以上这些问题,当然,只是初略封装,感兴趣的童鞋可以继续封装。话不多说,直接上代码!
function parseNumber (value, config) {
if (isNaN(value)) return '???'
if ([null, undefined, '',].includes(value)) return '-'
if (value == 0) return '0'
let locales = undefined
let options = {}
if (config) {
if (Reflect.has(config, 'locales')) {
locales = config.locales
}
if (Reflect.has(config, 'useGrouping')) {
options.useGrouping = config.useGrouping
}
if (Reflect.has(config, 'currency')) {
options.style = 'currency'
options.currency = config.currency
}
if (Reflect.has(config, 'fractionDigits')) {
options.minimumFractionDigits = config.fractionDigits
options.maximumFractionDigits = config.fractionDigits
}
if (Reflect.has(config, 'percent')) {
options.style = 'percent'
options.maximumFractionDigits = config.percent
}
} else {
locales = 'zh-CN'
options.minimumFractionDigits = 2
options.maximumFractionDigits = 2
}
const nf = new Intl.NumberFormat(locales, options)
return nf.format(value)
}
const test = [null, undefined, '', {}, 'aa', '111aaa', [],
0, 0.0, 0.0000, -0.0,
'0', '0.0', '0.000', '-0.0',
]
test.forEach(item => console.log(parseMoney(item)))
简单说明一下:
- 传值不是数字或数字字符串时,返回‘???’
- 对于==0 的数字,咱没必要再显示小数位或是百分号了,直接返回 0
- 传参value不仅仅只是一个数字,也可以是0.1+0.2这种表达式,把前端计算交给Intl去处理,在js中0.1+0.2 =0.30000000000000004的情况,在Intl中不会出现,放心使用!
- 具体的使用方法在代码中都有注释,我就不过多废话了!
有问题的小伙伴欢迎留言,评论,点赞关注,谢啦!!!
谁能仅靠十年寒窗苦读,去经营百岁人生? 活到老,学到老! 知识改变人生! 共勉!
|