面試隨筆---數字轉RMB中文

總想寫完OXITE關于數據庫的分析,但是工作比較忙沒時間去寫啊,畢竟第一次帶團隊開發。經驗比較欠缺,所以只好自己辛苦點,學習如何帶隊。

今天Q群里再一次引起面試討論呵呵,這一次,是一位上海的兄弟去面試的題目,大概的將數字模式轉為中文模式,例如:101 ==壹佰零壹圓。時間要求半個小時到一個小時,最近對文檔多于程序的情況下自己。。就寫了下,非常不幸。。居然花了1個多小時。才勉強算是收貨的。

我的思路是,首先建立對應的表,

            Hashtable hash = new Hashtable();

            hash.Add("0", "零");

            hash.Add("1", "壹");

            hash.Add("2", "贰");

            hash.Add("3", "叁");

            hash.Add("4", "肆");

            hash.Add("5", "伍");

            hash.Add("6", "陆");

            hash.Add("7", "柒");

            hash.Add("8", "捌");

            hash.Add("9", "玖");

            hash.Add("-1", "圓");

            hash.Add("-2", "拾");

            hash.Add("-3", "佰");

            hash.Add("-4", "仟");

            hash.Add("-5", "萬");

            hash.Add("-6", "拾萬");

            hash.Add("-7", "佰萬");

            hash.Add("-8", "仟萬");

            hash.Add("-9", "億");

            hash.Add("-10", "角");

        hash.Add("-11", "分");

 

這樣的設置很巧妙的可以減少大部分的CASE語句。只需要匹配就行。首先我們是要循環遍歷這些數字,將這些數字轉為中文。同時要將這些個位佰位仟位分開。所以我巧妙的設置了上表。

 

這樣就只需要在循環的時候,遍歷根據不同的數字,不同的位置進行匹配,完成switch語句里的大部分工作,甚至不需要任何switch。

 

看代碼:


 1 //構造hash表,方便進行查找;
 2             Hashtable hash = new Hashtable();
 3             hash.Add("0"""
);
 4             hash.Add("1"""
);
 5             hash.Add("2"""
);
 6             hash.Add("3"""
);
 7             hash.Add("4"""
);
 8             hash.Add("5"""
);
 9             hash.Add("6"""
);
10             hash.Add("7"""
);
11             hash.Add("8"""
);
12             hash.Add("9"""
);
13             hash.Add("-1"""
);
14             hash.Add("-2"""
);
15             hash.Add("-3"""
);
16             hash.Add("-4"""
);
17             hash.Add("-5"""
);
18             hash.Add("-6""拾萬"
);
19             hash.Add("-7""佰萬"
);
20             hash.Add("-8""仟萬"
);
21             hash.Add("-9"""
);
22             hash.Add("-10"""
);
23             hash.Add("-11"""
);
24 //獲取數值

25             string ss = textBox1.Text.Trim();
26             string sss = string
.Empty;
27 //分割小數點

28             string[] ww = ss.Split('.');
29 //循環標識

30             int i = 1;
31 //除零標識

32             int cc = 1;
33 //整數部分循環變換

34             while (i <= ww[0].Length)
35 
            {
36 //除零操作

37                 if (ww[0].Substring(ww[0].Length - i, 1== "0")
38 
                {
39 //記錄零點

40                     cc++;
41 //判零操作

42                     if (cc != i || cc == 2)
43 
                    {
44                         sss += hash["0"].ToString() + "|"
;
45 
                    }
46                     i++
;
47 
                }
48                 else

49                 {
50 //非零部分

51                     string sub = string.Empty;
52 //匹配數位

53                     sub = hash["-" + (i).ToString()].ToString();
54                     sss += sub + "|"
;
55 //匹配數字

56                     sub = hash[ww[0].Substring(ww[0].Length - i, 1)].ToString();
57                     sss += sub + "|"
;
58                     i++
;
59 
                }
60 
            }
61 //除“|”因為我們死從個位開始遍歷數字的,現在我們要將數字倒過來并去“|”

62             string[] www = sss.Substring(0, sss.Length - 1).Split('|');
63             string s111 = string
.Empty;
64             for (int k = www.Length; k > 0; k--
)
65 
            {
66                 s111 += www[k - 1
];
67 
            }
68 //小數部分如果有小數,則執行下面操作

69             if (ww.Length == 2)
70 
            {
71 //只考慮2位小數,角分部分

72                 for (int f = 0; f <= ww[1].Length && f < 2; f++)
73 
                {
74 //小數點部分的數字讀法和中文讀法一樣,我使用直接左邊讀

75                     s111 += hash[ww[1].Substring(f, 1)].ToString();
76 //判角位還是分位

77                     if (f == 0)
78 
                    {
79                         s111 += hash["-10"
].ToString();
80 
                    }
81                     if (f == 1
)
82 
                    {
83                         s111 += hash["-11"
].ToString();
84 
                    }
85 
                }
86 
            }
87 //顯示結果

88             label1.Text = s111;
89 

 

以上代碼我都加了注釋,相信看起來不難,具體代碼,大家可以去Q群:51021155 的共享拿原代碼。。。沒研究怎么在BLOG上傳文件。

上面的代碼我不敢說執行效率如何,我的做法就是根據 KEY –VALUE去進行匹配而不是通過switch去進行匹配,這樣做的好處是可以減少代碼的行數。因為開始做的時候我給自己的目標是半小時寫出來的。好像有點高估了自己的實力。花了一個小時多一點。

 

我覺得自己浪費的時間是在除零上,我覺得這個做發的最大亮點是右向左轉左向右,簡化的復雜的匹配問題。

例如:1001 讀法應該是 :壹仟零壹圓

PS:因為想寫快點。變量命名都是亂按的

你可能感兴趣的:(中文)