经典代码与设计技巧(经验累积)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了经典代码与设计技巧(经验累积)相关的知识,希望对你有一定的参考价值。

一路走来,写过不少优雅的代码,但是很少将这些代码记下来,以至于很多都忘了,感觉是一种损失,不过现在开始记录 应该不晚吧!

更优雅的价格验证(ts版)

加入时间:2017-10-31 10:50:35

场景:输入0.01~9999.99的价格,最多两位小数。
常见解法是正则表达式:类似于这样  /^(([1-9]\d{0,3})|0)(\.\d{0,2})?$/  。但是想写出一个适应性强的正则,真的很难,比如用户输入 +5  05  .5   这3种情况都是正确的,却不满足前面的正则。如果还要加一些额外操作,比如自动去掉加号,去掉首位的0,加上小数点前面的0;

优雅版(初步):

1   if (/^[+-]*\d*(\.\d*)?$/.test(this.price) && !Number.isNaN(+this.price)) {//合法十进制数据的格式。(注意,不能只用第二个条件,否则十六进制数,如0x10  会被转化成16 !)
2      let price: number = +this.price;
3      this.price = price + "";
4      this.priceValidFlag = (price >= 0.01 && price <= 9999.99) && (price * 100 % 1 === 0);
5    } else {
6      this.priceValidFlag = false;
7    }

if 判断的第一个条件很有意思,任何一个十进制数都满足这个正则,无论你写成什么形式 !!
这段代码所有要求都能实现,修改方便,也比较直观,唯一的问题是小数可能被替换,比如5.0 变成5 ,而且用户可以输入5.520 。接下来做一下修改,保留所有小数,且真正的限制小数位数:

优雅版(修改)

1   if (/^[+-]*\d*(\.\d{0,2})?$/.test(this.price) && !Number.isNaN(+this.price)) {//合法十进制数据(最多两位小数)
2     let price: number = +this.price;
3     this.price = PriceInputComponent.keepDecimalStr(this.price, price + "");
4     this.priceValidFlag = price >= 0.01 && price <= 9999.99;
5   }

红色不是是修改的地方

行1,将小数位数判断放到正则中(同时删除行4的 小数验证)实现正真的限制小数位数为2位!
行3,写了一个方法将原数据的所有小数部分保留下来,代码很简单:

技术分享
  static keepDecimalStr(oldStr: string, dataStr: string): string {
    let oldPointInd = oldStr.indexOf(‘.‘);
    if (oldPointInd === -1) {//没有小数,不做处理,直接返回。
      return dataStr;
    }
    let decimalStr = oldStr.substr(oldPointInd);//取到小数

    let dataPointInd = dataStr.indexOf(‘.‘);
    if (dataPointInd !== -1) {//有小数,先删掉,取到整数
      dataStr = dataStr.substr(0, dataPointInd);
    }
    return dataStr + decimalStr;//整数位 + 小数位
  }
View Code

 






以上是关于经典代码与设计技巧(经验累积)的主要内容,如果未能解决你的问题,请参考以下文章

一些代码小技巧&经典代码

Java项目经验

Android课程---Android Studio使用小技巧:提取方法代码片段

Java项目经验

Java项目经验

大话设计,没有模式—通用权限设计与实现