最近在总结工作中使用频率较高的方法,由于项目中经常会涉及到流量、money等等数字,就想着出一个规范的方法来统一展示在前端页面上的数字以适应产品提出的各种需求。好家伙,这写起来可是发现了巨渊深坑。
/**
* 完成Boolean、Null、String转换为Number类型,并支持以向上取整、向下取整、四舍五入的方式保留指定数位
* @param {Boolean || Null || String || Number} val 转换目标
* @param {Number} precision 精确数位,默认保留两位小数,根据项目经验暂定最多支持9位小数
* @param {String} type 转换方式,默认round四舍五入,同时支持ceil向上取整、floor向下取整
* @return 返回转换后的数字所对应的字符串
*/
const toNumber = (val, precision=2, type='round') => {
// 待填充
}
复制代码
我的心路历程:
- 过滤掉不能转化成有效数字的数据类型。
最霸道的方式莫过于Number()大法,然而却惊喜的发现Number([])竟然输出0!!!
那么6种原始类型 + Object作为Number的参数究竟都会输出些什么呢?(以下结果均在Chrome v73.0.3683.86 64位正式版本运行)
- Boolean
- Null
- Undefined
- Number 毕竟是一家,就不验证了
- String
- Symbol(“那么问题来了”系列之一:Symbol到底是个什么玩意)
- Object
array function date math RegExp ……
……
……
(“那么问题来了”系列之二:Number到底是如何处理的)
由上所示我们可以发现,虽然数组啊、日期啊在作为Number()的参数的时候可能会返回数字,但从产品的角度上来说这简直太……了吧。所以大胆的将这种情况刨除在外,只支持Boole