總想寫完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:因為想寫快點。變量命名都是亂按的