//// <summary> /// 人民幣大小寫金額轉換 /// </summary> class RMBCapitalization { private const string DXSZ = "零壹貳叄肆伍陸柒捌玖"; private const string DXDW = "毫厘分角元拾佰仟萬拾佰仟億拾佰仟萬兆拾佰仟萬億京拾佰仟萬億兆垓"; private const string SCDW = "元拾佰仟萬億京兆垓"; /// <summary> /// 轉換整數為大寫金額 /// 最高精度為垓,保留小數點后4位,實際精度為億兆已經足夠了,理論上精度無限制,如下所示: /// 序號:...30.29.28.27.26.25.24 23.22.21.20.19.18 17.16.15.14.13 12.11.10.9 8 7.6.5.4 . 3.2.1.0 /// 單位:...垓兆億萬仟佰拾 京億萬仟佰拾 兆萬仟佰拾 億仟佰拾 萬仟佰拾元 . 角分厘毫 /// 數值:...1000000 000000 00000 0000 00000 . 0000 /// 下面列出網上搜索到的數詞單位: /// 元、十、百、千、萬、億、兆、京、垓、秭、穰、溝、澗、正、載、極 /// </summary> /// <param name="capValue">整數值</param> /// <returns>返回大寫金額</returns> private static string ConvertIntToUppercaseAmount(string capValue) { string currCap = ""; //當前金額 string capResult = ""; //結果金額 string currentUnit = "";//當前單位 string resultUnit = ""; //結果單位 int prevChar = -1; //上一位的值 int currChar = 0; //當前位的值 int posIndex = 4; //位置索引,從"元"開始 if (Convert.ToDouble(capValue) == 0) return ""; for (int i = capValue.Length - 1; i >= 0; i--) { currChar = Convert.ToInt16(capValue.Substring(i, 1)); if (posIndex > 30) { //已超出最大精度"垓"。注:可以將30改成22,使之精確到兆億就足夠了 break; } else if (currChar != 0) { //當前位為非零值,則直接轉換成大寫金額 currCap = DXSZ.Substring(currChar, 1) + DXDW.Substring(posIndex, 1); } else { //防止轉換后出現多余的零,例如:3000020 switch (posIndex) { case 4: currCap = "元"; break; case 8: currCap = "萬"; break; case 12: currCap = "億"; break; case 17: currCap = "兆"; break; case 23: currCap = "京"; break; case 30: currCap = "垓"; break; default: break; } if (prevChar != 0) { if (currCap != "") { if (currCap != "元") currCap += "零"; } else { currCap = "零"; } } } //對結果進行容錯處理 if (capResult.Length > 0) { resultUnit = capResult.Substring(0, 1); currentUnit = DXDW.Substring(posIndex, 1); if (SCDW.IndexOf(resultUnit) > 0) { if (SCDW.IndexOf(currentUnit) > SCDW.IndexOf(resultUnit)) { capResult = capResult.Substring(1); } } } capResult = currCap + capResult; prevChar = currChar; posIndex += 1; currCap = ""; } return capResult; } /// <summary> /// 轉換小數為大寫金額 /// </summary> /// <param name="capValue">小數值</param> /// <param name="addZero">是否增加零位</param> /// <returns>返回大寫金額</returns> private static string ConvertDecToUppercaseAmount(string capValue, bool addZero) { string currCap = ""; string capResult = ""; int prevChar = addZero ? -1 : 0; int currChar = 0; int posIndex = 3; if (Convert.ToInt16(capValue) == 0) return ""; for (int i = 0; i < capValue.Length; i++) { currChar = Convert.ToInt16(capValue.Substring(i, 1)); if (currChar != 0) { currCap = DXSZ.Substring(currChar, 1) + DXDW.Substring(posIndex, 1); } else { if (Convert.ToInt16(capValue.Substring(i)) == 0) { break; } else if (prevChar != 0) { currCap = "零"; } } capResult += currCap; prevChar = currChar; posIndex -= 1; currCap = ""; } return capResult; } /// <summary> /// 人民幣大寫金額 /// </summary> /// <param name="value">人民幣數字金額值</param> /// <returns>返回人民幣大寫金額</returns> public static string RMBAmount(double value) { string capResult = ""; string capValue = string.Format("{0:f4}", value); //格式化 int dotPos = capValue.IndexOf("."); //小數點位置 bool addInt = (Convert.ToInt32(capValue.Substring(dotPos + 1)) == 0);//是否在結果中加"整" bool addMinus = (capValue.Substring(0, 1) == "-"); //是否在結果中加"負" int beginPos = addMinus ? 1 : 0; //開始位置 string capInt = capValue.Substring(beginPos, dotPos); //整數 string capDec = capValue.Substring(dotPos + 1); //小數 if (dotPos > 0) { capResult = ConvertIntToUppercaseAmount(capInt) + ConvertDecToUppercaseAmount(capDec, Convert.ToDouble(capInt) != 0 ? true : false); } else { capResult = ConvertIntToUppercaseAmount(capDec); } if (addMinus) capResult = "負" + capResult; if (addInt) capResult += "整"; return capResult; } }
此類方法實現了將人民幣數字金額轉換為小寫,直接調用RMBCapitalization.RMBAmount(人民幣數字金額)