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

 

posted @ 2016-08-12 15:37  莫西西杯  阅读(305)  评论(0编辑  收藏  举报