數字轉漢字 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-十億一千零一十萬一千零一十

更多序列等待補充

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