zoukankan      html  css  js  c++  java
  • 阿拉伯数字金额转换为汉语大写

        最近在做项目中遇到这样一个问题, 要求将金额数字形式转换为汉语形式,例如:101,转换为壹佰零壹元。其实项目中已经给出了实现的代码,只不过感觉它写的存在一点问题。那么这个是如何实现的呢?

        方法一:

         转换的方法如下:

    public static string Trans2RMB(string money)
            {         
    
                #region 存在多余零
                //将小写金额转换成大写金额  
                double MyNumber = Convert.ToDouble(money);
                String[] MyScale = { "分", "角", "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "兆", "拾", "佰", "仟" };   //单位对应的汉字
                String[] MyBase = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };//数字对应的汉字
                String M = "";
                bool isPoint = false;
                if (money.IndexOf(".") != -1)  
                {
                    money = money.Remove(money.IndexOf("."), 1);//去除小数点
                    isPoint = true;
                }
                for (int i = money.Length; i > 0; i--)
                {
                    int MyData = Convert.ToInt16(money[money.Length - i].ToString());//?
                    M += MyBase[MyData];//?
                    if (isPoint == true)
                    {
                        M += MyScale[i - 1];//?
                    }
                    else
                    {
                        M += MyScale[i + 1];//?
                    }
                }
                return M; 
                #endregion
              
            }
          然后写数据进行测试:     

     public static void Main(string[] args)
            {
                money = "230067890080.01";            
                Console.WriteLine(Trans2RMB(money));
               
                money = "230000000000.00";
                Console.WriteLine(Trans2RMB(money));
    
                money = "2300.00";
                Console.WriteLine(Trans2RMB(money));
                Console.ReadKey();
    }
         其运行结果如下:

         

       该结果就是我在项目中所看到的结果,其中如果连续出现几位都是“0”时,仍然将其转换,就出现了如上图所示的效果。很明显,这样的结果并不是我们所要的。


        方法二:

          转换的方法如下:  

    public static string CmycurD(decimal num)
            {
                string strCapital = "零壹贰叁肆伍陆柒捌玖";            //0-9所对应的汉字
                string strCapitalUnit = "万仟佰拾亿仟佰拾万仟佰拾元角分"; //金额单位所对应的汉字
    
                string strCapitalMoney = "";  //人民币大写金额形式  
                string capitalNum = "";    //数字的汉语读法
                string capitalUnit = "";    //数字位的汉字读法
                int countZero = 0;  //用来计算连续的零值是几个
                int temp;            //从原num值中取出的值
                num = Math.Round(Math.Abs(num), 2);    //将num取绝对值并四舍五入取2位小数
                string strNum = ((long)(num * 100)).ToString();  //将num中的小数点去除,并转换成字符串形式
                int j = strNum.Length;      //金额总长度(排除小数点),如101.01的j=5
                if (j > 15) { return "溢出"; }//限制金额在万亿以下(在往上貌似也没有这么土豪。。)
                strCapitalUnit = strCapitalUnit.Substring(15 - j);   //取出对应位数的所有的单位值。如:101.01,j为5所以strCapitalUnit=佰拾元角分
    
                string strTempNum = "";    //用于存放从num值中依次取出的值,进行循环转换  
                //循环取出每一位需要转换的值
                for (int i = 0; i < j; i++)
                {
                    strTempNum = strNum.Substring(i, 1);          //循环取出需转换的每一位的值
                    temp = Convert.ToInt32(strTempNum);      //转换为数字
                    if (i != (j - 3) && i != (j - 7) && i != (j - 11) && i != (j - 15))
                    {
                        //当所取位数不为元、万、亿、万亿上的数字时
                        if (strTempNum == "0")
                        {
                            capitalNum = "";
                            capitalUnit = "";
                            countZero = countZero + 1;
                        }
                        else
                        {
                            if (strTempNum != "0" && countZero != 0)
                            {
                                capitalNum = "零" + strCapital.Substring(temp * 1, 1);
                                capitalUnit = strCapitalUnit.Substring(i, 1);
                                countZero = 0;
                            }
                            else
                            {
                                capitalNum = strCapital.Substring(temp * 1, 1);
                                capitalUnit = strCapitalUnit.Substring(i, 1);
                                countZero = 0;
                            }
                        }
                    }
                    else
                    {
                        //该位是万亿,亿,万,元位等关键位
                        if (strTempNum != "0" && countZero != 0)
                        {
                            capitalNum = "零" + strCapital.Substring(temp * 1, 1);
                            capitalUnit = strCapitalUnit.Substring(i, 1);
                            countZero = 0;
                        }
                        else
                        {
                            if (strTempNum != "0" && countZero == 0)
                            {
                                capitalNum = strCapital.Substring(temp * 1, 1);
                                capitalUnit = strCapitalUnit.Substring(i, 1);
                                countZero = 0;
                            }
                            else
                            {
                                if (strTempNum == "0" && countZero >= 3)
                                {
                                    capitalNum = "";
                                    capitalUnit = "";
                                    countZero = countZero + 1;
                                }
                                else
                                {
                                    if (j >= 11)
                                    {
                                        capitalNum = "";
                                        countZero = countZero + 1;
                                    }
                                    else
                                    {
                                        capitalNum = "";
                                        capitalUnit = strCapitalUnit.Substring(i, 1);
                                        countZero = countZero + 1;
                                    }
                                }
                            }
                        }
                    }
                    if (i == (j - 11) || i == (j - 3))
                    {
                        //如果该位是亿位或元位,则必须写上
                        capitalUnit = strCapitalUnit.Substring(i, 1);
                    }
                    strCapitalMoney = strCapitalMoney + capitalNum + capitalUnit;
    
                    if (i == j - 1 && strTempNum == "0")
                    {
                        //最后一位(分)为0时,加上“整”
                        strCapitalMoney = strCapitalMoney + '整';
                    }
                }
                if (num == 0)
                {
                    strCapitalMoney = "零元整";
                }
                return strCapitalMoney;
            }
            public static string CmycurD(string numstr)
            {
                try
                {
                    decimal num = Convert.ToDecimal(numstr);
                    return CmycurD(num);
                }
                catch
                {
                    return "非数字形式!";
                }
            }
        其调用的过程跟法一是相同的,就不再叙述,运行结果如下:

        


      小结:

         虽然这样已经得到自己想要的结果,但这并不是最终的目的。首先这些方法都是通过查找资料找到的,还需要自己再用心的琢磨这个过程,真正的做到为我所用,并且可以到达更好的效果。在日常生活中,遇到问题,没有想法和思路时,不妨先站在巨人的肩膀上,等你有能力了,再去做那个可以让别人站的巨人。

  • 相关阅读:
    如何进入高效学习状态
    shell printf命令:格式化输出语句
    C# virtual、abstract
    git解决Could not execute editor
    go defer笔记
    git从其他分支提取文件merge到当前分支
    golang map
    状态模式
    golang单例模式
    go 单元测试时读取配置文件
  • 原文地址:https://www.cnblogs.com/victor-grace/p/7253753.html
Copyright © 2011-2022 走看看