[代码评审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


浙公网安备 33010602011771号