項目中經常會格式化數據,轉換數字的使用情況比較多,記錄一下數字轉換的方法! 如果需要轉換為繁體中文,將數組裡的漢字換成繁體中文即可。 1.阿拉伯數字轉換為中文數字 2.中文數字轉換為阿拉伯數字 ...
項目中經常會格式化數據,轉換數字的使用情況比較多,記錄一下數字轉換的方法!
如果需要轉換為繁體中文,將數組裡的漢字換成繁體中文即可。
1.阿拉伯數字轉換為中文數字
1 /// <summary> 2 /// 阿拉伯數字轉換成中文數字 3 /// </summary> 4 /// <param name="x"></param> 5 /// <returns></returns> 6 public string NumToChinese(string x) 7 { 8 string[] pArrayNum = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" }; 9 //為數字位數建立一個位數組 10 string[] pArrayDigit = { "", "十", "百", "千" }; 11 //為數字單位建立一個單位數組 12 string[] pArrayUnits = { "", "萬", "億", "萬億" }; 13 var pStrReturnValue = ""; //返回值 14 var finger = 0; //字元位置指針 15 var pIntM = x.Length % 4; //取模 16 int pIntK; 17 if (pIntM > 0) 18 pIntK = x.Length / 4 + 1; 19 else 20 pIntK = x.Length / 4; 21 //外層迴圈,四位一組,每組最後加上單位: ",萬億,",",億,",",萬," 22 for (var i = pIntK; i > 0; i--) 23 { 24 var pIntL = 4; 25 if (i == pIntK && pIntM != 0) 26 pIntL = pIntM; 27 //得到一組四位數 28 var four = x.Substring(finger, pIntL); 29 var P_int_l = four.Length; 30 //內層迴圈在該組中的每一位數上迴圈 31 for (int j = 0; j < P_int_l; j++) 32 { 33 //處理組中的每一位數加上所在的位 34 int n = Convert.ToInt32(four.Substring(j, 1)); 35 if (n == 0) 36 { 37 if (j < P_int_l - 1 && Convert.ToInt32(four.Substring(j + 1, 1)) > 0 && !pStrReturnValue.EndsWith(pArrayNum[n])) 38 pStrReturnValue += pArrayNum[n]; 39 } 40 else 41 { 42 if (!(n == 1 && (pStrReturnValue.EndsWith(pArrayNum[0]) | pStrReturnValue.Length == 0) && j == P_int_l - 2)) 43 pStrReturnValue += pArrayNum[n]; 44 pStrReturnValue += pArrayDigit[P_int_l - j - 1]; 45 } 46 } 47 finger += pIntL; 48 //每組最後加上一個單位:",萬,",",億," 等 49 if (i < pIntK) //如果不是最高位的一組 50 { 51 if (Convert.ToInt32(four) != 0) 52 //如果所有4位不全是0則加上單位",萬,",",億,"等 53 pStrReturnValue += pArrayUnits[i - 1]; 54 } 55 else 56 { 57 //處理最高位的一組,最後必須加上單位 58 pStrReturnValue += pArrayUnits[i - 1]; 59 } 60 } 61 return pStrReturnValue; 62 }
2.中文數字轉換為阿拉伯數字
1 /// <summary> 2 /// 轉換數字 3 /// </summary> 4 protected static long CharToNumber(char c) 5 { 6 switch (c) 7 { 8 case '一': return 1; 9 case '二': return 2; 10 case '三': return 3; 11 case '四': return 4; 12 case '五': return 5; 13 case '六': return 6; 14 case '七': return 7; 15 case '八': return 8; 16 case '九': return 9; 17 case '零': return 0; 18 default: return -1; 19 } 20 } 21 22 /// <summary> 23 /// 轉換單位 24 /// </summary> 25 protected static long CharToUnit(char c) 26 { 27 switch (c) 28 { 29 case '十': return 10; 30 case '百': return 100; 31 case '千': return 1000; 32 case '萬': return 10000; 33 case '億': return 100000000; 34 default: return 1; 35 } 36 } 37 /// <summary> 38 /// 將中文數字轉換阿拉伯數字 39 /// </summary> 40 /// <param name="cnum">漢字數字</param> 41 /// <returns>長整型阿拉伯數字</returns> 42 public static long ParseCnToInt(string cnum) 43 { 44 cnum = Regex.Replace(cnum, "\\s+", ""); 45 long firstUnit = 1;//一級單位 46 long secondUnit = 1;//二級單位 47 long result = 0;//結果 48 for (var i = cnum.Length - 1; i > -1; --i)//從低到高位依次處理 49 { 50 var tmpUnit = CharToUnit(cnum[i]);//臨時單位變數 51 if (tmpUnit > firstUnit)//判斷此位是數字還是單位 52 { 53 firstUnit = tmpUnit;//是的話就賦值,以備下次迴圈使用 54 secondUnit = 1; 55 if (i == 0)//處理如果是"十","十一"這樣的開頭的 56 { 57 result += firstUnit * secondUnit; 58 } 59 continue;//結束本次迴圈 60 } 61 if (tmpUnit > secondUnit) 62 { 63 secondUnit = tmpUnit; 64 continue; 65 } 66 result += firstUnit * secondUnit * CharToNumber(cnum[i]);//如果是數字,則和單位想乘然後存到結果里 67 } 68 return result; 69 }