写完这段格式化金额的代码自认为很优雅,结果...

1,663 阅读2分钟

本文正在参加「金石计划」

有这么一个需求,将金额后面的0抹掉。什么意思呢?举个例子:

  • 9.00 -> 9
  • 9.90 -> 9.9
  • 9.99 -> 9.99
  • 0.00 -> 0

拿到这个需求,我思考如何能够知道它末尾有几个无用的0。我是这么想的,假如我把字符串截取掉最后一位或两位时,判断这两个数值是否相同(通过两个字符相减可得),如果相同则被截取掉的是无用的0。

看以下代码:

// 截取最后一位
let price = '9.00';
price.slice(0, -1) // '9.0'
price - price.slice(0, -1) // 0
// 截取最后两位
let price = '9.01';
price.slice(0, -2) // '9.'  这边的9.当作为数字计算时将被转化成数字9来处理
price - price.slice(0, -2) // 0.01

有了这个条件,去除末尾的0就好办了。咱们写个格式化金额的函数:

function formatPrice(price) {
    if(price - price.slice(0, -2) === 0) {
        return price.slice(0, -3); // 要把多余的.干掉
    } else if(price - price.slice(0, -1) === 0) {
        return price.slice(0, -1);
    } else {
        return price;
    }
}

测试:

image.png

完美马路比。再换成三元表达式:

function formatPrice(price) {
    return price - price.slice(0, -2) === 0
        ? price.slice(0, -3)
        : price - price.slice(0, -1) === 0 
            ? price.slice(0, -1)
            : price
}

image.png

效果一毛一样。好嗨森!优雅!实在是优雅,谁能想到这么绝绝子的办法呀。佩服佩服

然后,我就去百度了一下,看看大家是不是都如我这样机智。结果...

我发现我就是个傻子。话不多说,直接扔代码吧:

function formatPrice(price) {
    return price * 1
}

image.png

且不说这代码简单吧,单从实现的效果都比我刚刚那个“优雅”的代码好。人家兼容字符串和数字的价格并且返回的是数字。我TMD...

dew2321.gif

结语

我们在日常开发中,常常会写一些自认为不错的代码,然而现实情况是,你这个就是个辣鸡。作为一个程序员,有一个通病就是觉得别人写的代码都是垃圾,自己写的都是优雅的,其实啊,多学习人家的代码,取其精华去其糟粕,我们才能进步,才能写出真正优雅的代码。

本文故事及代码均为真实案例,欢迎评论区讨论自己写过的“优雅代码”吧。期待JYM的留言