要求

传入一个数字,转成10%这种百分比的形式,如果存在小数则四舍五入保留2位小数,如果小数位是0则不保留。

代码

function toPercent(num: number): string {
    if (num % 1 !== 0) {
        let percentageNum = (num * 100).toFixed(2);
        percentageNum = percentageNum.endsWith('.00')
            ? percentageNum.slice(0, -3)
            : percentageNum.endsWith('0')
            ? percentageNum.slice(0, -1)
            : percentageNum;
        return `${percentageNum}%`;
    } else {
        return `${num * 100}%`;
    }
}

这里面有一个非常绝的操作就是采用求余的方式判断是整数还是小数,num % 1在num是整数情况下,余数永远是0,而小数情况余的是小数。

于是这里很精妙的做了分割,我们只需要关注小数的转换即可。

由于存在小数的情况下,需要判断它的末尾是不是0,toFixed那怕没有这么多小数其实是会补零的。

其实我感觉应该不需要判断.00的情况,但是以防万一还是做了,两个三元组合在一起做了0值小数的去除。

这里使用了es6的endsWith匹配方法,这个方法貌似性能不是很好,因为我看vite的一篇更新中讲到将endsWith这些匹配方法替换成了其他的办法,所以,如果你有很高的性能要求,可以考虑其他办法,比如正则、split(".")拆分等方式。

分类: TypeScript 标签: 数值百分比转换

评论

目录