Skip to content

人民币金额大写

chen shucheng edited this page Oct 9, 2018 · 1 revision
    /// <summary>
    /// 金额转换成中文大写金额
    /// </summary>
    /// <param name="LowerMoney">eg:10.74</param>
    /// <returns></returns>
    public static string MoneyToUpper(string LowerMoney)
    {
        string functionReturnValue = null;
        bool IsNegative = false; // 是否是负数
        if (LowerMoney.Trim().Substring(0, 1) == "-")
        {
            // 是负数则先转为正数
            LowerMoney = LowerMoney.Trim().Remove(0, 1);
            IsNegative = true;
        }
        string strLower = null;
        string strUpart = null;
        string strUpper = null;
        int iTemp = 0;
        // 保留两位小数 123.489→123.49  123.4→123.4
        LowerMoney = Math.Round(double.Parse(LowerMoney), 2).ToString();
        if (LowerMoney.IndexOf(".") > 0)
        {
            if (LowerMoney.IndexOf(".") == LowerMoney.Length - 2)
            {
                LowerMoney = LowerMoney + "0";
            }
        }
        else
        {
            LowerMoney = LowerMoney + ".00";
        }
        strLower = LowerMoney;
        iTemp = 1;
        strUpper = "";
        while (iTemp <= strLower.Length)
        {
            switch (strLower.Substring(strLower.Length - iTemp, 1))
            {
                case ".":
                    strUpart = "圆";
                    break;
                case "0":
                    strUpart = "零";
                    break;
                case "1":
                    strUpart = "壹";
                    break;
                case "2":
                    strUpart = "贰";
                    break;
                case "3":
                    strUpart = "叁";
                    break;
                case "4":
                    strUpart = "肆";
                    break;
                case "5":
                    strUpart = "伍";
                    break;
                case "6":
                    strUpart = "陆";
                    break;
                case "7":
                    strUpart = "柒";
                    break;
                case "8":
                    strUpart = "捌";
                    break;
                case "9":
                    strUpart = "玖";
                    break;
            }

            switch (iTemp)
            {
                case 1:
                    strUpart = strUpart + "分";
                    break;
                case 2:
                    strUpart = strUpart + "角";
                    break;
                case 3:
                    strUpart = strUpart + "";
                    break;
                case 4:
                    strUpart = strUpart + "";
                    break;
                case 5:
                    strUpart = strUpart + "拾";
                    break;
                case 6:
                    strUpart = strUpart + "佰";
                    break;
                case 7:
                    strUpart = strUpart + "仟";
                    break;
                case 8:
                    strUpart = strUpart + "万";
                    break;
                case 9:
                    strUpart = strUpart + "拾";
                    break;
                case 10:
                    strUpart = strUpart + "佰";
                    break;
                case 11:
                    strUpart = strUpart + "仟";
                    break;
                case 12:
                    strUpart = strUpart + "亿";
                    break;
                case 13:
                    strUpart = strUpart + "拾";
                    break;
                case 14:
                    strUpart = strUpart + "佰";
                    break;
                case 15:
                    strUpart = strUpart + "仟";
                    break;
                case 16:
                    strUpart = strUpart + "万";
                    break;
                default:
                    strUpart = strUpart + "";
                    break;
            }

            strUpper = strUpart + strUpper;
            iTemp = iTemp + 1;
        }

        strUpper = strUpper.Replace("零拾", "零");
        strUpper = strUpper.Replace("零佰", "零");
        strUpper = strUpper.Replace("零仟", "零");
        strUpper = strUpper.Replace("零零零", "零");
        strUpper = strUpper.Replace("零零", "零");
        strUpper = strUpper.Replace("零角零分", "整");
        strUpper = strUpper.Replace("零分", "整");
        strUpper = strUpper.Replace("零角", "零");
        strUpper = strUpper.Replace("零亿零万零圆", "亿圆");
        strUpper = strUpper.Replace("亿零万零圆", "亿圆");
        strUpper = strUpper.Replace("零亿零万", "亿");
        strUpper = strUpper.Replace("零万零圆", "万圆");
        strUpper = strUpper.Replace("零亿", "亿");
        strUpper = strUpper.Replace("零万", "万");
        strUpper = strUpper.Replace("零圆", "圆");
        strUpper = strUpper.Replace("零零", "零");

        // 对壹圆以下的金额的处理
        if (strUpper.Substring(0, 1) == "圆")
        {
            strUpper = strUpper.Substring(1, strUpper.Length - 1);
        }
        if (strUpper.Substring(0, 1) == "零")
        {
            strUpper = strUpper.Substring(1, strUpper.Length - 1);
        }
        if (strUpper.Substring(0, 1) == "角")
        {
            strUpper = strUpper.Substring(1, strUpper.Length - 1);
        }
        if (strUpper.Substring(0, 1) == "分")
        {
            strUpper = strUpper.Substring(1, strUpper.Length - 1);
        }
        if (strUpper.Substring(0, 1) == "整")
        {
            strUpper = "零圆整";
        }
        functionReturnValue = strUpper;

        if (IsNegative == true)
        {
            return "负" + functionReturnValue;
        }
        else
        {
            return functionReturnValue;
        }
    }
`

### 方法二
(1)    方法一
如片段9-20所示,主要步骤如下:
1)    取得整数和小数部分
2)    对整数部分进行反转,依次从个位数起添加数量单位
3)    将阿拉伯数字替换成大写数字
4)    替换不符合汉语规律的词汇,例如仟佰、零佰、零拾等

private string ConvertToChinese(double dou){
// 大写数字数组
string[] num = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
// 数量单位数组,个位数为空
string[] unit = { "", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "兆" };
string d = dou.ToString();
string zs = string.Empty;// 整数
string xs = string.Empty;// 小数
int i = d.IndexOf(".");
string str = string.Empty;
if (i > -1) {
// 仅考虑两位小数
zs = d.Substring(0, i);
xs = d.Substring(i + 1, d.Length - i - 1); str = "元"; if (xs.Length == 1) str = str + xs + "角"; else if (xs.Length == 2) str = str + xs.Substring(0, 1) + "角" + xs.Substring(1, 1) + "分"; } else { zs = d; str = "元整"; } // 处理整数部分 if (!string.IsNullOrEmpty(zs)) { i = 0; // 从整数部分个位数起逐一添加单位 foreach (char s in zs.Reverse()) { str = s.ToString() + unit[i] + str; i++; } } // 将阿拉伯数字替换成中文大写数字 for (int m = 0; m < 10; m++) { str = str.Replace(m.ToString(), num[m]); } // 替换零佰、零仟、零拾之类的字符 str = Regex.Replace(str, "[零]+仟", "零"); str = Regex.Replace(str, "[零]+佰", "零"); str = Regex.Replace(str, "[零]+拾", "零"); str = Regex.Replace(str, "[零]+亿", "亿"); str = Regex.Replace(str, "[零]+万", "万"); str = Regex.Replace(str, "[零]+", "零"); str = Regex.Replace(str, "亿[万|仟|佰|拾]+", "亿"); str = Regex.Replace(str, "万[仟|佰|拾]+", "万"); str = Regex.Replace(str, "仟[佰|拾]+", "仟"); str = Regex.Replace(str, "佰拾", "佰"); str = Regex.Replace(str, "[零]+元整", "元整"); return str;}

` string s = dou.ToString("#L#E#D#C#K#E#D#C#J#E#D#C#I#E#D#C#H#E#D#C#G#E#D#C#F#E#D#C#.0B0A");string d = Regex.Replace(s, @"((?<=-|^)[^-1-9])|((?'z'0)[0A-E]((?=[1-9])|(?'-z'(?=[F-L.]|$)))) |((?'b'[F-L])(?'z'0)[0A-L]*((?=[1-9])|(?'-z'(?=[.]|$))))", "${b}${z}");string RMB= "负元空零壹贰叁肆伍陆柒捌玖空空空空空空空分角拾佰仟万亿兆京垓秭穰";string r = Regex.Replace(d, ".", m => RMB[m.Value[0] - '-'].ToString());if (r.EndsWith("元")) r = r + "整";

string value = Regex.Replace(d, ".", delegate(Match m){ return RMB[m.Value[0] - '-'].ToString(); }); string r = Regex.Replace(d, ".", new MatchEvaluator(GetChinese));

private string GetChinese(Match m) { string RMB = "负元空零壹贰叁肆伍陆柒捌玖空空空空空空空分角拾佰仟万亿兆京垓秭穰"; return RMB[m.Value[0] - '-'].ToString();

方法三

public static String ConvertToChinese(Decimal number)
{
var s = number.ToString("#L#E#D#C#K#E#D#C#J#E#D#C#I#E#D#C#H#E#D#C#G#E#D#C#F#E#D#C#.0B0A");
var d = Regex.Replace(s, @"((?<=-|^)[^1-9])|((?'z'0)[0A-E]((?=[1-9])|(?'-z'(?=[F-L.]|$))))|((?'b'[F-L])(?'z'0)[0A-L]*((?=[1-9])|(?'-z'(?=[.]|$))))", "${b}${z}");
var r = Regex.Replace(d, ".", m => "负元空零壹贰叁肆伍陆柒捌玖空空空空空空空分角拾佰仟万亿兆京垓秭穰"[m.Value[0] - '-'].ToString());
return r;
}

方法四

public string NumToChinese(string x) { //数字转换为中文后的数组 //转载请注明来自 http://www.shang11.com string[] P_array_num = new string[] { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; //为数字位数建立一个位数组 string[] P_array_digit = new string[] { "", "拾", "佰", "仟" }; //为数字单位建立一个单位数组 string[] P_array_units = new string[] { "", "万", "亿", "万亿" }; string P_str_returnValue = ""; //返回值 int finger = 0; //字符位置指针 int P_int_m = x.Length % 4; //取模 int P_int_k = 0; if (P_int_m > 0) P_int_k = x.Length / 4 + 1; else P_int_k = x.Length / 4; //外层循环,四位一组,每组最后加上单位: ",万亿,",",亿,",",万," for (int i = P_int_k; i > 0; i--) { int P_int_L = 4; if (i == P_int_k && P_int_m != 0) P_int_L = P_int_m; //得到一组四位数 string four = x.Substring(finger, P_int_L); int P_int_l = four.Length; //内层循环在该组中的每一位数上循环 for (int j = 0; j < P_int_l; j++) { //处理组中的每一位数加上所在的位 int n = Convert.ToInt32(four.Substring(j, 1)); if (n == 0) { if (j < P_int_l - 1 && Convert.ToInt32(four.Substring(j + 1, 1)) > 0 && !P_str_returnValue.EndsWith(P_array_num[n])) P_str_returnValue += P_array_num[n]; } else { if (!(n == 1 && (P_str_returnValue.EndsWith(P_array_num[0]) | P_str_returnValue.Length == 0) && j == P_int_l - 2)) P_str_returnValue += P_array_num[n]; P_str_returnValue += P_array_digit[P_int_l - j - 1]; } } finger += P_int_L; //每组最后加上一个单位:",万,",",亿," 等 if (i < P_int_k) //如果不是最高位的一组 { if (Convert.ToInt32(four) != 0) //如果所有4位不全是0则加上单位",万,",",亿,"等 P_str_returnValue += P_array_units[i - 1]; } else { //处理最高位的一组,最后必须加上单位 P_str_returnValue += P_array_units[i - 1]; } } return P_str_returnValue; }

#region 【将商品金额小写转换成大写】MoneySmallToBig ///

/// 将商品金额小写转换成大写 /// /// 小写金额 /// 处理后的大写金额 public static string MoneySmallToBig(string par) { String[] Scale = { "分", "角", "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "兆", "拾", "佰", "仟" }; String[] Base = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; String Temp = par; string result = null; int index = Temp.IndexOf(".", 0, Temp.Length);//判断是否有小数点 if (index != -1) { Temp = Temp.Remove(Temp.IndexOf("."), 1); for (int i = Temp.Length; i > 0; i--) { int Data = Convert.ToInt16(Temp[Temp.Length - i]); result += Base[Data - 48]; result += Scale[i - 1]; } } else { for (int i = Temp.Length; i > 0; i--) { int Data = Convert.ToInt16(Temp[Temp.Length - i]); result += Base[Data - 48]; result += Scale[i + 1]; } } return result; } #endregion
Clone this wiki locally