数字转汉字 C#实现

C# 数字转汉字

​ 心血来潮需要用一发数字转汉字的算法,但是网上的好多现成算法bug满满,只好自己写了一波,欢迎指导捉虫,不多说直接上代码:

    public static class Format
    {
        static string[] Numbers = new string[] { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖", "拾" };
        static string[] Units = new string[] { "", "拾", "佰", "千", "万", "拾", "佰", "千", "亿", "拾" };

        public static string ParseNumbers(uint n)
        {
            string result = "";
            string s = n.ToString();
            int zero = 0;//连续出现的零的个数
            int length = s.Length;
            for (int i = 0; i < length; i++)
            {
                int number = s[i] - '0';
                int unit = length - i - 1;
                //一十X、一十X万、一十X亿,一十X万亿开头时,省略开头的一
                if ((length + 2) % 4 == 0 && i == 0 && number == 1 && zero == 0)
                {
                    result += Units[unit];
                }
                //不为零时直接输出数字+单位
                else if (number != 0)
                {
                    result += Numbers[number] + Units[unit];
                    zero = 0;
                }
                //为零且在最后一位时,如果前面有连续零,去掉前面的零,否则不操作
                else if (unit == 0)
                {
                    if (zero > 0) result = result.Substring(0, result.Length - 1);
                    else if (length == 1) result += Numbers[0];
                }
                //是亿等级时,必然打出亿。
                //是万等级时,如果没有亿则必然打出万,如果有亿但整个万级别不都是零也打出万
                else if (unit == 8 || (unit == 4 && (length <= 8 || zero < 3)))
                {
                    if (zero > 0)
                    {
                        result = result.Substring(0, result.Length - 1);                   
                    }
                    zero = 0;//重置zero
                    result += Units[length - i - 1];
                }
                //中间普通的零
                else
                {
                    if (zero == 0)
                    {
                        result += Numbers[0];
                    }
                    zero++;
                }
            }
            return result;
        }
    }
关于测试:

​ 显然,测试序列使用一些普通的数字没有意义,显然这个算法最脆弱的地方就是零和连续的零,所以我已经通过了以下这些测试用例:

100000000-一亿

1000000000-十亿

1000100000-十亿零一十万

10000010-一千万零一十

100000001-一亿零一

1000000001-十亿零一

1000001001-十亿零一千零一

1001001001-十亿零一百万一千零一

101010101-一亿零一百零一万零一百零一

1010101010-十亿一千零一十万一千零一十

更多序列等待补充

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章