背景:从接口获取到一个数字,前端需要转换到万,亿等单位。并始终保留两位小数,不能四舍五入。
实现方式一:
使用if else的方式分别处理,整数,一位小数,两位小数,三位小数的情况,并且计算到小数点的位置。代码比较复杂,决定不采用
实现方式二:
使用split + substr ,具体实现。
/**
*
* @param value 任意数值
* @param count 大于0的整数
* @returns { string }
*/
const toFixed = function(value: number, count: number): string {
// 保留两位小数的情况
// 1 ---> [1 , 00 ]
// 1.1 ---> [1 , 1 ]
// 1.11 --->[1 , 11 ]
// 1.123 -->[1 , 123]
const [integer, decimal = '0'.repeat(count)] = value.toString().split('.');
// 加0是为了第二种情况
return integer + '.' + (decimal + '0'.repeat(count - 1)).substr(0, count);
};
实现方式三:使用replace + Regexp ,具体实现
/**
*
* @param value 任意数值
* @param count 大于0的整数
* @returns { string }
*/
const toFixedReg = function(value: number, count: number): string {
// 小括号内是我们想要的结果
const reg = new RegExp(`(\\d+\\.?\\d{0,${count}})[\\.\\d]*`);
//拼接.00是考虑入参是整数的情况 拼接0是考虑入参是一位小数的情况
// 保留两位小数的情况
// 1 ----> 1.00-------> 1.00 + 0 -----------------> 1.00
// 1.1---> 1.1.00-----> 1.1 + 0 -----------------> 1.10
// 1.11--> 1.11.00----> 1.11 + 0 -----------------> 1.11
// 1.123-> 1.123.00---> 1.12 + 0 -----------------> 1.12
return (value + '.' + '0'.repeat(count)).replace(reg, '$1' + '0'.repeat(count - 1)).replace(reg, '$1');
};