正则表达式和decimal format的实际项目运用
最近review测试框架底层代码,一是看看有哪些可以重构的,以便减少冗余增加重用,二是优化一下代码结构增强代码的健壮性。
其中有一个地方印象比较深刻,特记录分享如下:
背景:在电商场景中,价格是特别重要而且敏感的信息,对价格的读取和验证是测试的重点之一。
但是有时候价格信息被包裹在一堆信息之中,如何准确而快速的获取价格则是作为一个自动化测试开发人员必须要考虑的问题。
下面我们举例说明,并提供相应的代码。
场景:商品价格包含在一个字符串中,其中包括字母和字符,比如:此商品的价格为‘3.2’元。
目标:获取商品的价格且保留两位小数,不足部分补零。
review原有代码,发现有两个问题
1. 原有代码通过两个方法来实现,代码结构不够紧凑。
2. 通过逐个字符遍历的方式取出价格,虽能达成业务目标但代码不够精炼。
3. 当商品价格为整数时不能正确处理。
解决思路:
1. 融合两个方法,通过一个方法来处理问题。
2. 使用正则表达式来匹配字符串中的价格信息,然后获取价格。
3. 使用decimal format来格式化数字,并增强代码逻辑,修复商品为整数时出错的问题。
完成新代码后:
1. 30行代码代替原来50行代码,结构更加紧凑。
2. 减少了底层方法之间的互相调用。
3. 使用正则表达式更加高效,精准。
如有对正则表达式或decimal format的基础知识有疑问,再次不做说明,请自行百度。
代码如下:
public String getPrice(String str){ String price=null; float floatPrice=0; String pattern = "#.##"; int index = 0; String reg = "\\D+(\\d*\\.?\\d*).*"; // String patten = "\\D+(\\d+|([1-9]+\\d*\\.\\d*).*"; if (str!=""&&str.length()>0) price = str.replaceFirst(reg, "$1"); else System.out.println("String is blank."); floatPrice=Float.parseFloat(price); DecimalFormat decimal = new DecimalFormat(pattern); String priceFloat2= decimal.format(floatPrice); if (priceFloat2.indexOf(".")==-1) { index=priceFloat2.length(); priceFloat2 = priceFloat2 +".00"; } else try {index=priceFloat2.indexOf("."); priceFloat2.charAt(index+2); // System.out.println(priceFloat2.charAt(priceFloat2.indexOf(".")+2)); } catch (Exception e) { priceFloat2 = priceFloat2 +"0"; } return priceFloat2; }