经典代码与设计技巧(经验累积)
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;//整数位 + 小数位 }
以上是关于经典代码与设计技巧(经验累积)的主要内容,如果未能解决你的问题,请参考以下文章