[代码评审2]代码评审
来源:P2P系统,ConvertNumber.cs
1)货币格式处理,一行代码能够解决,写了2个函数
原来函数(用了复杂的方法):只是参数类型不一样,囧
修改后,真的只要一行代码,扩展方法(static 类 static 方法 this 参数)请参考相关资料
测试代码
测试结果
ToString()和String.Format()可以参考:
http://www.cnblogs.com/bignjl/articles/1935645.html
2) 判断是否为正整数,请使用正则
正则表达式参考以下链接:http://www.cnblogs.com/shalang/archive/2010/09/03/1816656.html
http://www.cnblogs.com/lucas/archive/2009/02/18/1392986.html
原函数:
改造后:+可以替换成 *或者{数字}
测试:
3)无意义函数,可以删除
---1---
2个函数意义分析:把对象转换成Double,转换失败则转换成0。。。(第二个重载函数多了个判断,是非为空格或空串)
首先这是两个作用
a)判断是否为空格或空串,判读是否为double类型 ===》判断类型,应该在UI通过正则验证
b)如为double类型,则进行类型转换 ===》类型转换一句话搞定,无需函数。
原函数
----2----
以下函数类似,可以删除
int正则为:"^\d+$" ===> 如果可以为负数,就是 "^(-)?\d+$"
4)代码写的累不累?
又是ConvertToDouble,这次又多了个功能,精确到小数点几位,幸好最多只有10位,,,,
原代码:
不说啥了,帮改写下
方法1:
判断字符串为数字后,通过Math函数处理精度。
方法2:
通过字符串处理,,保留原有思路。简化方法
结果如下:
5) 对于double、float、decimal类型的不理解,导致前文代码(包括优化代码也没改)有错误
测试代码如下
精确到10位,,然而只精确到9位,why???看下面。所以前文第4)部分 累死累活精确到10位,毫无意义啊,中间转换用的Double不是Decimal啊。默默的就错了
float:浮点型,含字节数为4,32bit,数值范围为-3.4E38~3.4E38(7个有效位)
double:双精度实型,含字节数为8,64bit数值范围-1.7E308~1.7E308(15个有效位)
decimal:数字型,128bit,不存在精度损失,常用于银行帐目计算。(28个有效位)
float f = 345.98756f;//结果显示为345.9876,只显示7个有效位,对最后一位数四舍五入。
double d=345.975423578631442d;//结果显示为345.975423578631,只显示15个有效位,对最后一位四舍五入。
注:float和double的相乘操作,数字溢出不会报错,会有精度的损失。
decimal dd=345.545454879.....//可以支持28位,对最后一位四舍五入。
注:当对decimal类型进行操作时,数值会因溢出而报错。
6)数字转大写,写了10个函数,能不能控制在3个以内,能啊!!!
看看原来代码
----第一段---
有一个问题,第一句if return被注释了,会导致不是数字继续执行,然后第二句if就抛出异常。处理方法有2:----本此优化都不处理
a)应该把形参改成Double或者Decimal,判断正整数在UI中处理,而不是算法中处理
b)如果在算法中处理,那么直接抛出异常,抛出异常,UI也得重新捕获进行处理
----又写了一个一模一样的函数,仅仅 圆和元的区别,😓----接下来,引用的函数,也是如此,为了区分繁简,多了一模一样的函数,
————————以简体为例分析函数-----
然后采用了一个超级复杂的算法。
数字转换,一个函数ConvertChinese
4位以下数字用了4个函数,ConvertDigit(str),Convert2Digit(str),Convert3Digit(str),Convert4Digit(str),一个一个字符替换
直接重新写个算法吧(方法很多
a---正则算法,写出来简单,写的过程困难
b---/10 算法,
c---这里简单演示第三种)
------8个函数完成一个功能。。。。
首先,汉字直接写字符串,通过数字下标获取汉子,这样就不需要函数了----简单写了个实现(没有处理小数点后)---总之不用n个函数吧???
小数点后就不写了,应该简单
比想象的要复杂,测试出了错误,重新写了
static public string ConvertData2(this string str) { // string valueStr = Convert.ToDouble(str).ToString("0000000000000.00"); string digit = "零壹贰叁肆伍陆柒捌玖"; string Dom = "仟佰拾万仟佰拾亿仟佰拾万仟佰拾元"; //特殊处理元万亿,3 7 11 15/0 4 8 12 // 开始位置x +4 +4 +4 = ? string[] splitstr = str.Split('.'); string valueStr1 = splitstr[0]; // 不补齐零的整数 int iStart = Dom.Length - valueStr1.Length; // iStart保证>=0,否则无法处理 StringBuilder chBuilder = new StringBuilder(); for(int i = 0; i < valueStr1.Length; i++) { int a = valueStr1[i] - '0'; // 每位数字 // int b = Dom[iStart+i]; // 对应单位 if (a != 0) { chBuilder.Append( digit[a] ); chBuilder.Append( Dom[iStart+i] ); } // 如果a==0 && i==0,说明valueStr1[0]=0 // 1) 说明传的double数据不对。 // 2) 说明数字是0,例如0.3883处理后,只有一个0 else if ((iStart+i) > 2 && (iStart+i-3) % 4 == 0)// 特殊单位位置 { chBuilder.Append( Dom[iStart+i] ); } else if ( i > 0 && valueStr1[i-1] != '0' || ((iStart+i) > 3 && (iStart+i-3) % 4 == 1)) { chBuilder.Append( digit[a] ); } } // "零".ToCharArray() string strReturn = chBuilder.ToString(); strReturn = strReturn.Replace("零亿", "亿"); strReturn = strReturn.Replace("亿零万零", "亿零"); // 亿0000[0] =亿零 strReturn = strReturn.Replace("亿零万", "亿零"); // 亿0000[1-9] =亿[1-9] strReturn = strReturn.Replace("零万", "万"); // [1-9][0万] =[1-9]万 strReturn = strReturn.Replace("零元", "元"); strReturn = strReturn.Trim("万".ToCharArray()); if (strReturn == "元" && splitstr.Length == 2) strReturn = ""; else if (strReturn == "元" && splitstr.Length == 1) { strReturn = "零元"; } return strReturn; }
与改进之前算法不同的数据如下
同时写了测试数据
if (string.IsNullOrEmpty(searchString)) { for (int i = 0; i < 512; i++) { string iTest = Convert.ToString(i, 2); // 测试1 新算法 string one = iTest.ConvertData2(); // searchString += iTest + ":" + + '\n'; // 测试2 原算法 ConvertNumber cn = new ConvertNumber(); string two = cn.ConvertData(iTest); if (!(one == two + "元")) searchString += iTest + ":" + one + "," + two + "元" + "," + (one == two + "元") + '\n'; } }
和超复杂算法对比结果如下:超复杂算法还有错误。。改进算法不知道还有和超复杂算法一样的错误没
101000000:壹亿零壹佰万元,壹亿零壹佰元,False 101000001:壹亿零壹佰万零壹元,壹亿零壹佰零壹元,False 101000010:壹亿零壹佰万零壹拾元,壹亿零壹佰零壹拾元,False 101000011:壹亿零壹佰万零壹拾壹元,壹亿零壹佰零壹拾壹元,False 101000100:壹亿零壹佰万零壹佰元,壹亿零壹佰零壹佰元,False 101000101:壹亿零壹佰万零壹佰零壹元,壹亿零壹佰零壹佰零壹元,False 101000110:壹亿零壹佰万零壹佰壹拾元,壹亿零壹佰零壹佰壹拾元,False 101000111:壹亿零壹佰万零壹佰壹拾壹元,壹亿零壹佰零壹佰壹拾壹元,False 101001000:壹亿零壹佰万壹仟元,壹亿零壹佰零壹仟元,False 101001001:壹亿零壹佰万壹仟零壹元,壹亿零壹佰零壹仟零壹元,False 101001010:壹亿零壹佰万壹仟零壹拾元,壹亿零壹佰零壹仟零壹拾元,False 101001011:壹亿零壹佰万壹仟零壹拾壹元,壹亿零壹佰零壹仟零壹拾壹元,False 101001100:壹亿零壹佰万壹仟壹佰元,壹亿零壹佰零壹仟壹佰元,False 101001101:壹亿零壹佰万壹仟壹佰零壹元,壹亿零壹佰零壹仟壹佰零壹元,False 101001110:壹亿零壹佰万壹仟壹佰壹拾元,壹亿零壹佰零壹仟壹佰壹拾元,False 101001111:壹亿零壹佰万壹仟壹佰壹拾壹元,壹亿零壹佰零壹仟壹佰壹拾壹元,False 110000000:壹亿壹仟万元,壹亿壹仟元,False 110000001:壹亿壹仟万零壹元,壹亿壹仟零壹元,False 110000010:壹亿壹仟万零壹拾元,壹亿壹仟零壹拾元,False 110000011:壹亿壹仟万零壹拾壹元,壹亿壹仟零壹拾壹元,False 110000100:壹亿壹仟万零壹佰元,壹亿壹仟零壹佰元,False 110000101:壹亿壹仟万零壹佰零壹元,壹亿壹仟零壹佰零壹元,False 110000110:壹亿壹仟万零壹佰壹拾元,壹亿壹仟零壹佰壹拾元,False 110000111:壹亿壹仟万零壹佰壹拾壹元,壹亿壹仟零壹佰壹拾壹元,False 110001000:壹亿壹仟万壹仟元,壹亿壹仟零壹仟元,False 110001001:壹亿壹仟万壹仟零壹元,壹亿壹仟零壹仟零壹元,False 110001010:壹亿壹仟万壹仟零壹拾元,壹亿壹仟零壹仟零壹拾元,False 110001011:壹亿壹仟万壹仟零壹拾壹元,壹亿壹仟零壹仟零壹拾壹元,False 110001100:壹亿壹仟万壹仟壹佰元,壹亿壹仟零壹仟壹佰元,False 110001101:壹亿壹仟万壹仟壹佰零壹元,壹亿壹仟零壹仟壹佰零壹元,False 110001110:壹亿壹仟万壹仟壹佰壹拾元,壹亿壹仟零壹仟壹佰壹拾元,False 110001111:壹亿壹仟万壹仟壹佰壹拾壹元,壹亿壹仟零壹仟壹佰壹拾壹元,False 111000000:壹亿壹仟壹佰万元,壹亿壹仟壹佰元,False 111000001:壹亿壹仟壹佰万零壹元,壹亿壹仟壹佰零壹元,False 111000010:壹亿壹仟壹佰万零壹拾元,壹亿壹仟壹佰零壹拾元,False 111000011:壹亿壹仟壹佰万零壹拾壹元,壹亿壹仟壹佰零壹拾壹元,False 111000100:壹亿壹仟壹佰万零壹佰元,壹亿壹仟壹佰零壹佰元,False 111000101:壹亿壹仟壹佰万零壹佰零壹元,壹亿壹仟壹佰零壹佰零壹元,False 111000110:壹亿壹仟壹佰万零壹佰壹拾元,壹亿壹仟壹佰零壹佰壹拾元,False 111000111:壹亿壹仟壹佰万零壹佰壹拾壹元,壹亿壹仟壹佰零壹佰壹拾壹元,False 111001000:壹亿壹仟壹佰万壹仟元,壹亿壹仟壹佰零壹仟元,False 111001001:壹亿壹仟壹佰万壹仟零壹元,壹亿壹仟壹佰零壹仟零壹元,False 111001010:壹亿壹仟壹佰万壹仟零壹拾元,壹亿壹仟壹佰零壹仟零壹拾元,False 111001011:壹亿壹仟壹佰万壹仟零壹拾壹元,壹亿壹仟壹佰零壹仟零壹拾壹元,False 111001100:壹亿壹仟壹佰万壹仟壹佰元,壹亿壹仟壹佰零壹仟壹佰元,False 111001101:壹亿壹仟壹佰万壹仟壹佰零壹元,壹亿壹仟壹佰零壹仟壹佰零壹元,False 111001110:壹亿壹仟壹佰万壹仟壹佰壹拾元,壹亿壹仟壹佰零壹仟壹佰壹拾元,False 111001111:壹亿壹仟壹佰万壹仟壹佰壹拾壹元,壹亿壹仟壹佰零壹仟壹佰壹拾壹元,False