您的位置:首页 > 其它

人民币金额由阿拉伯数值转换成汉字大写数值的函数

2008-09-03 12:17 567 查看
分成四个步骤:

1。数字的转化。阿拉伯数字转换为汉字大写字符

2。整数部分的转化。

       分节:四位一组,从个位开始分节

       每节转化为汉字大写数值:比如“1234”转化成 “壹仟贰佰叁拾肆万”

       每节加上单位:

      补零:

      整合成最后的数值:

3。 小数不份转化。

      十分位转化为‘角’

      百分位转化为‘分’

      其他位不转化    

/// <summary>
        /// 判断是否是数字字符串
        /// </summary>
        /// <param name="str">字符串</param>
        /// <returns>true 是数字字符串,false 不是数字字符串</returns>
        private bool JudgeNumber(string str)
        {
            //用正则表达式的方式判断
            System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(@"^[-]?/d+[.]?/d*$");
            return reg.IsMatch(str);
        }

        /// <summary>
        /// 将阿拉伯字符装换位汉字大写字符,比如‘1’转化为‘壹’
        /// </summary>
        /// <param name="str">阿拉伯字符</param>
        /// <returns>汉字大写字符</returns>
        private string convertnumtochs(string str)
        {
            string[] arr = new string[10] {"零" ,"壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };

            string result="";

            switch (str)
                {
                    case "0":
                        result = arr[0];
                            break;
                    case "1":
                            result =  arr[1];
                            break;
                    case "2":
                            result =  arr[2];
                            break;
                    case "3":
                            result =  arr[3];
                            break;
                    case "4":
                            result =  arr[4];
                            break;
                    case "5":
                            result =arr[5];
                            break;
                    case "6":
                            result =  arr[6];
                            break;
                    case "7":
                            result = arr[7];
                            break;
                    case "8":
                            result =arr[8];
                            break;
                    case "9":
                            result = arr[9];
                            break;
                }               

            return result;
        }
        /// <summary>
        /// 将四位阿拉伯数字转化成汉字大写数字,比如'1234' 转化成 '壹仟贰佰叁拾肆'
        /// </summary>
        /// <param name="num">阿拉伯数字</param>
        /// <returns>汉字大写字符</returns>
        string convertfournumber(string num)
        {
            //判断是否阿拉伯数字组成的字符串
            if (!JudgeNumber(num))
                return "";
            //字符串长度超过4个,或者为空,都不处理。
            if (num.Length > 4 || num.Length < 1)
                return "";
            //不足四位的前面补零
            if (num.Length < 4)
            {
                num = "0000" + num;
                num = num.Substring(num.Length - 4, 4);
            }
            //特殊情况
            if (num == "0000")
                return "";
            //临时变量
            string result = "";
            string temp = "";
            string temp1, temp2, temp3;
            //处理四位阿拉伯数字
            //保留各位字符
            temp = num.Substring(0, 1);
            temp1 = num.Substring(1, 1);
            temp2 = num.Substring(2, 1);
            temp3 = num.Substring(3, 1);
            //处理千位,为零不处理
            if (temp != "0")
               result = convertnumtochs(temp) + "仟";
            //一起出来十位,百位
            if (temp1 != "0" && temp2 != "0")    //百位,十位都是非零数字
                result = result + convertnumtochs(temp1) + "佰" + convertnumtochs(temp2) + "拾";
            else
            {
                if (temp1 == "0" && temp2 == "0")   //百位,十位都为零,但是千位,个位都不为零
                {
                    if(temp != "0" && temp3 != "0")
                        result = result + "零";//补个零
                }
                else
                {
                    if (temp1 == "0")  //百位为零,十位不为零,千位不为零
                    {
                        if(temp != "0")
                              result = result + "零" + convertnumtochs(temp2) + "拾";  //千位和十位间补零
                        else
                            result = result +  convertnumtochs(temp2) + "拾";  //千位和十位间补零
                    }
                    else//百位不为零,十位为零
                    {
                        if (temp3 != "0")//个位不为零
                            result = result + convertnumtochs(temp1) + "佰" + "零"; //百位和个位间补零
                        else
                            result = result + convertnumtochs(temp1) + "佰" ; //百位和个位间补零
                    }
                }
            }
            //处理个位,为零不处理
            temp = num.Substring(3, 1);
            if (temp != "0")
                result =result+convertnumtochs(temp) ;
            //返回值
            return result;               

        }
        /// <summary>
        /// 将一个数字字符串按照指定长度,和方向,截取成一段段的字符串,比如说123456789,截取长度为4,
        /// 从右到左,截取三个字符串,'1','2345','6789'
        /// </summary>
        /// <param name="str">被截取的字符串</param>
        /// <param name="length">截取长度</param>
        /// <param name="type">true:从左往右. false:从右到左</param>
        /// <returns>分段的列表</returns>
        IList<string> breakstring(string str, int length, bool type)
        {
            //保存返回结果
            IList<string> list = new List<string>();
            //两种特殊情况,1.截取的字符长度小于1,被截取的字符串长度小于1
            if (length < 1)
                return list;
            if (str.Length < 1)
                return list;
            //截取的长度大于被截取的字符串长度
            if (length >= str.Length)
            {
                list.Add(str);
                return list;
            }

            string temp;
            int positon = 0;//初始位置为零
            int i = 0;//截取次数的标量
            //从左往右截取字符串
            if (type)
            {
                positon = 0;//初始位置为零
                i = 0;//截取次数的标量
                while (positon < str.Length)
                {
                    temp = str.Substring(positon, length);
                    i++;
                    if (temp != "")
                        list.Add(temp);
                    else
                        break;
                    positon = positon +  length;
                }
            }
            else
            {
                positon = str.Length - length;
                if (positon > length*(-1) && positon < 0)//如果str长度小于length长度
                    positon = 0;
                i = 0;
                while (positon >= 0)
                {
                    if (str.Length > length)
                        temp = str.Substring(positon, length);
                    else
                        temp = str;
                    i++;
                    str = str.Substring(0, str.Length - temp.Length);
                    if (temp != "")
                        list.Add(temp);//保存在列表中的顺序是反的
                    else
                        break;
                    positon = positon - length;
                    if (positon > length * (-1) && positon < 0)//被截取字符串最后剩下的长度不到截取的长度
                        positon = 0;
                }
            }
            return list;
        }

        /// <summary>
        /// 将一个阿拉伯整数转化成汉字大写数字字符串,处理的最大数字单位为千万亿亿
        /// </summary>
        /// <param name="str">阿拉伯字符串</param>
        /// <returns>汉字大写数字字符串</returns>
        string intconvert(string str)
        {

            //特殊情况
            if (!JudgeNumber(str)) //判断字符串中有没有非数字字符
                return "";
            if (str.Length < 1) //字符串为空
                return "";
            //从右往左截断字符串,四位为一组分节
            IList<string> list = breakstring(str, 4, false);
            IList<string> chslist = new List<string>();
            //保留返回结果
            string result = "";
            //数字分节单位,四位为一组分节

            //数字分节后的,段数目
            int num = list.Count;
            string temp;
            //一段段全部转化为汉字大写数字
            for (int i = 0; i < 6; i++)
            {
                if (i > num-1) break;
                temp = list[i];
                temp = convertfournumber(temp);
                chslist.Add(temp);
            }
            //每一段补充数字单位,低于万位不需要处理
            //处理万位段

            if (chslist.Count > 1)
            {
                if (chslist[1] != "")
                    chslist[1] = chslist[1] + "万";
            }

            if (chslist.Count == 3)
            {
                if (chslist[2] != "")
                    chslist[2] = chslist[2] + "亿";
            }
            //处理亿位和万亿位段,同时为空不需要处理
            if (chslist.Count >= 4)
            {
                if (chslist[2] != "" || chslist[3] != "")
                {
                    if (chslist[2] != "" && chslist[3] != "")
                    {
                        chslist[2] = chslist[2] + "亿";
                        chslist[3] = chslist[3] + "万";
                    }
                    else
                    {
                        if (chslist[3] != "")
                            chslist[3] = chslist[3] + "万亿";
                        else
                            chslist[2] = chslist[2] + "亿";
                    }
                }
            }
            if (chslist.Count == 5)
            {
                if (chslist[4] != "")
                    chslist[4] = chslist[4] + "亿亿";
            }
            //处理亿亿位,万亿亿位段,同时为空不需要处理
            if (chslist.Count >= 6)
            {
                if (chslist[4] != "" || chslist[5] != "")
                {
                    if (chslist[4] != "" && chslist[5] != "")
                    {
                        chslist[4] = chslist[4] + "亿亿";
                        chslist[5] = chslist[5] + "万";
                    }
                    else
                    {
                        if (chslist[5] != "")
                            chslist[5] = chslist[5] + "万亿亿";
                        else
                            chslist[4] = chslist[4] + "亿亿";
                    }
                }
            }

            //补中间的零位,主要在有数字的段最前面补零,本节上面第一位为0,上节的最后一位有0,就需要补零
            string temp1 ;
            string temp2 ;
            for (int i =0; i<chslist.Count-1; i++)
            {
                temp = chslist[i];
                if (temp != "" )
                {
                    temp1 = list[i];
                    temp2 = list[i + 1];
                    if (temp1.Substring(0, 1) == "0"||temp2.Substring(temp2.Length-1,1)=="0")
                        chslist[i] = "零" + chslist[i];
                }
            }
            //最后获得结果
            for (int i = 0; i < chslist.Count; i++)
                result = chslist[i] + result;
            //除掉开始的'零'
            if (result != "")
            {
                if (result.Substring(0, 1) == "零")
                    result = result.Substring(1, result.Length - 1);
            }
            if (result == "")
                result = "零";
            return result;
        }

        //小数部分转化
        string decimalconvert(string str)
        {
            if (!JudgeNumber(str))
                return "";
            string result = "";
            for (int i = 0; i < str.Length; i++)
            {
                if (i == 0)
                    result = result +convertnumtochs( str.Substring(i, 1)) + "角";
                if(i==1)
                    result = result +convertnumtochs( str.Substring(i, 1)) + "分";
                if (i > 2)
                    break;
            }
            return result;
        }
        //整个数值转化,阿拉伯金额转换为汉字大写金额
        string numconvert(string str)
        {
            if(!JudgeNumber(str))
                return "";
            int dotpos = str.IndexOf(".");
            string intnum = "", decimalnum = "";
            if (dotpos < 1)
                intnum = str;
            else
            {
                intnum = str.Substring(0, dotpos);
                decimalnum = str.Substring(dotpos + 1, str.Length - dotpos - 1);
            }
            if (intnum != "")
                intnum = intconvert(intnum);
           
            if (decimalnum != "")
                decimalnum = decimalconvert(decimalnum);

            if (intnum == "零" && decimalnum != "")
                intnum = "";

            if (intnum != "")
                intnum = intnum + "元";

            return intnum + decimalnum;
        }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息