见很糟糕的代码#虐心#!

最近做一个项目,上线之后直接挂了,我简直不能忍受这件事情!!!因为在上线之前我做了还算细致的单元测试,追根溯源,终于发现问题出在下面这个帮助类方法,先贴代码,大家猜猜它是做什么的:

public static String formatStrChina(String s) {
		if(s==null || "".equals(s) ){
			return "0.00元";
		}
		try {
			Double d = Double.valueOf("0.01");
			if(d == 0){
				return "0.00元";
			}
		} catch (Exception e) {
			e.printStackTrace();
			return "0.00元";
		}
		
		BigDecimal d1 = new BigDecimal(s);
		
		BigDecimal d2 = d1.divide(new BigDecimal(10000));

		// 将传进数字反转
		String str = String.valueOf(d2);

		String reverseStr = new StringBuilder(
				str.substring(0, str.indexOf("."))).reverse().toString();
		String strTemp = "";
		for (int i = 0; i < reverseStr.length(); i++) {
			if (i * 3 + 3 > reverseStr.length()) {
				strTemp += reverseStr.substring(i * 3, reverseStr.length());
				break;
			}
			strTemp += reverseStr.substring(i * 3, i * 3 + 3) + ",";
		}
		// 将 【789,456,】 中最后一个【,】去除
		if (strTemp.endsWith(",")) {
			strTemp = strTemp.substring(0, strTemp.length() - 1);
		}

		// 将数字重新反转
		String resultStr = new StringBuilder(strTemp).reverse().toString()
				+ str.substring(str.indexOf("."), str.length());
		return resultStr + "万";

	}

猜不出来了吧,很好,我也是这么想的,方法注释是这样的:

// 把数值型字符串,四舍五入保留两位以万元为单位

天地良心啊,这代码怎么能达到这个目的,先不说代码有多烂,这个................根本就不能用!!!简直全是bug在里面,

看看下面的部分:

try {
            int sd=Integer.parseInt(s);
            if(sd==0){
                return "0.00元";
            }
        } catch (Exception e) {
            return "0.00元";
        }

看到了吗?要是参数不带小数点直接就变成“0.00元”了,而且没有给异常栈信息打出来,根本就不知道这个异常过程的存在,好了,我们接着看下一个:

String resultStr = new StringBuilder(strTemp).reverse().toString()
                + str.substring(str.indexOf("."), str.length());

如果str里没有小数点 oh,my god!直接就崩掉了,天地良心,这个方法用在一个客户金额统计的地方,居然已经到线上了而且还很久了,我真的也是有点晕............

不吐槽了,填坑去

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值