zoukankan      html  css  js  c++  java
  • 人民币大小写转换

    using System;
    using System.Text;
    using System.Text.RegularExpressions;

    namespace HKH.Common
    {
     /// <summary>
     /// 人民币大小写格式转换
     /// </summary>
     /// <remarks> Create By Lwt on 2006/09/23
     /// </remarks>
     public class clsRMB
     {
      private clsRMB()
      {
      }

      #region 格式化

      /// <summary>
      /// 格式化(大写转小写)
      /// </summary>
      /// <param name="strRMB"></param>
      /// <returns></returns>
      public static double Format(string strRMB)
      {
       try
       {
        //正则表达式,验证第一位是否阿拉伯数字,确定转换格式
        //1.5亿----混写格式
        if(Regex.IsMatch(strRMB,"^\\d"))
        {
         //去掉元单位
         strRMB = Regex.Replace(strRMB,"元|圆","");
         char temp = strRMB[strRMB.Length - 1];
         if (temp == '万' || temp == '萬' || temp == '亿')
         {
          return Convert.ToDouble(strRMB.Substring(0,strRMB.Length - 1)) * Math.Pow(10,GetExp(temp));
         }
         else
         {
          return Convert.ToDouble(strRMB);
         }
        }
        //壹亿伍千万-----大写格式
        else 
        {
         return Eval(strRMB);
        }

       }
       catch
       {
        return -1;
       }
      }

      /// <summary>
      /// 格式化(小写转大写)
      /// </summary>
      /// <param name="numRMB"></param>
      /// <returns></returns>
      public static string Format(double numRMB)
      {
       try
       {
        if( 0 == numRMB)
         return "零元整";

        StringBuilder szRMB = new StringBuilder();

        //乘100以格式成整型,便于处理
        ulong iRMB = Convert.ToUInt64(numRMB * 100);

        szRMB.Insert(0,ToUpper(Convert.ToInt32(iRMB % 100),-2));
      
        //去掉原来的小数位
        iRMB = iRMB / 100;

        int iUnit = 0;

        //以每4位为一个单位段进行处理,所以下边除以10000
        while(iRMB != 0)
        {
         szRMB.Insert(0,ToUpper(Convert.ToInt32(iRMB % 10000),iUnit ));
         iRMB = iRMB / 10000;
         iUnit += 4;
        }
          
        string strRMB = szRMB.ToString();
        
        //格式修正
        strRMB = Regex.Replace(strRMB,"零+","零");
        strRMB = strRMB.Replace("元零整","元整");
        strRMB = strRMB.Replace("零元","元");

        return strRMB.Trim('零');
       }
       catch
       {
        return "";
       }
      }

      #endregion

      #region 私有方法

      /// <summary>
      /// 计算表达式(大写表达式求值)
      /// </summary>
      /// <param name="strRMB"></param>
      /// <returns></returns>
      private static double Eval(string strRMB)
      {
       try
       {
        if (null == strRMB )
         return 0;

        strRMB = Replace(strRMB,false);

        if ("" == strRMB)
         return 0;

        #region 利用位权进行计算

        //基础指数
        int basicExp = 0;
        //当前指数
        int currExp = 0;

        double numRMB = 0;

        for(int i = strRMB.Length - 1; i > -1 ; i --)
        {
         char temp = strRMB[i];

         if (temp == '元' || temp == '万' || temp == '亿' || temp == '圆' || temp == '萬' )
         {
          basicExp = GetExp(temp);
          currExp = 0;

          continue;
         }
         else
         {
          if(Regex.IsMatch(temp.ToString(),"^\\d"))
          {
           numRMB = numRMB + Convert.ToInt32(temp.ToString()) * Math.Pow(10,(basicExp + currExp));
          }
          else
          {
           currExp = GetExp(temp);
          }

         }
        }

        #endregion

        return numRMB;
       }
       catch
       {
        return -1;
       }
      }

      /// <summary>
      /// 计算表达式(小写数值求大写字符串)
      /// </summary>
      /// <param name="numRMB"></param>
      /// <param name="iUnit"></param>
      /// <returns></returns>
      private static string ToUpper(int numRMB,int iUnit)
      {
       try
       {
        if( 0 == numRMB )
        {
         if (iUnit == -2)
         {
          return "整";
         }
         
         if (iUnit == 0)
         {
          return "元";
         }

         return "零";
        }

        StringBuilder szRMB = new StringBuilder();

        string strRMB = "";
        
        #region 对角/分做特殊处理

        if (iUnit == -2)
        {
         int jiao = numRMB / 10;
         int fen = numRMB % 10;

         if (jiao > 0)
         {
          szRMB.Append(jiao);
          szRMB.Append(GetUnit(-1));

          if ( fen > 0)
          {
           szRMB.Append(fen);
           szRMB.Append(GetUnit(-2));
          }
         }
         else
         {
          szRMB.Append(fen);
          szRMB.Append(GetUnit(-2));
         }

         return Replace(szRMB.ToString(),true);
        }

        #endregion

        #region 以下为整数部分正常处理

        strRMB = numRMB.ToString("0000");

        //前一位是否是0
        bool hasZero = false;
        
        for ( int i = 0; i < strRMB.Length; i++ )
        {
         //只有四位,最高位为‘千’,所以下边的3-i为单位修正
         if ( ( 3-i ) > 0)
         {
          if( '0' != strRMB[i] )
          {
           szRMB.Append(strRMB[i]);
           szRMB.Append(GetUnit( 3-i ));
           hasZero = false;
          }
          else
          {
           if( !hasZero )
            szRMB.Append(strRMB[i]);

           hasZero = true;
          }
         }
         //最后一位,特别格式处理
         //如最后一位是零,则单位应在零之前
         else
         {
          if( '0' != strRMB[i] )
          {
           szRMB.Append(strRMB[i]);
           szRMB.Append(GetUnit( iUnit ));
           hasZero = false;
          }
          else
          {
           if (hasZero)
           {
            szRMB.Insert(szRMB.Length - 1,GetUnit( iUnit ));
           }
           else
           {
            szRMB.Append(GetUnit( iUnit ));
            szRMB.Append(strRMB[i]);
           }
          }
         }
        }

        //转换大写后返回
        return Replace(szRMB.ToString(),true);

        #endregion
       }
       catch
       {
        return "";
       }
      }

      /// <summary>
      /// 将中文大写换成阿拉伯数字
      /// </summary>
      /// <param name="strRMB"></param>
      /// <param name="toUpper">true--转换为大写/false--转换为小写</param>
      /// <returns></returns>
      private static string Replace(string strRMB,bool toUpper)
      {
       if(toUpper)
       {
        strRMB = strRMB.Replace("0","零");
        strRMB = strRMB.Replace("1","壹");
        strRMB = strRMB.Replace("2","贰");
        strRMB = strRMB.Replace("3","叁");
        strRMB = strRMB.Replace("4","肆");
        strRMB = strRMB.Replace("5","伍");
        strRMB = strRMB.Replace("6","陆");
        strRMB = strRMB.Replace("7","柒");
        strRMB = strRMB.Replace("8","捌");
        strRMB = strRMB.Replace("9","玖");
       }
       else
       {
        strRMB = strRMB.Replace("零","0");
        strRMB = strRMB.Replace("壹","1");
        strRMB = strRMB.Replace("贰","2");
        strRMB = strRMB.Replace("叁","3");
        strRMB = strRMB.Replace("肆","4");
        strRMB = strRMB.Replace("伍","5");
        strRMB = strRMB.Replace("陆","6");
        strRMB = strRMB.Replace("柒","7");
        strRMB = strRMB.Replace("捌","8");
        strRMB = strRMB.Replace("玖","9");
       }
       return strRMB;
      }

      /// <summary>
      /// 获取单位名称
      /// </summary>
      /// <param name="iCode"></param>
      /// <returns></returns>
      private static string GetUnit(int iCode)
      {
       switch(iCode)
       {
        case -2:
         return "分";
        case -1:
         return "角";
        case 0:
         return "元";
        case 1:
         return "拾";
        case 2:
         return "佰";
        case 3:
         return "仟";
        case 4:
         return "萬";
        case 8:
         return "亿";
        default:
         return "";
       }
      }

      /// <summary>
      /// 获取位权指数
      /// </summary>
      /// <param name="cUnit"></param>
      /// <returns></returns>
      private static int GetExp(char cUnit )
      {
       switch(cUnit)
       {
        case '分':
         return -2;
        case '角':
         return -1;
        case '元':
        case '圆':
         return 0;
        case '十':
        case '拾':
         return 1;
        case '百':
        case '佰':
         return 2;
        case '千':
        case '仟':
         return 3;
        case '万':
        case '萬':
         return 4;
        case '亿':
         return 8;
        default:
         return 0;
       }
      }

      #endregion

     }
    }
     

  • 相关阅读:
    MySQL Community Server 8.0.16
    Python的编码规范
    Python 的语言特性
    spark笔记 环境配置
    C#委托实现工厂规则注入
    特性与元数据
    可输入的模糊搜索ComBox控件
    ASPX页面输出datatable的一种方法
    QRcode生成二维码,保存二维码图片到服务器
    SQL语句的随机值与行号,字符串拼接
  • 原文地址:https://www.cnblogs.com/88223100/p/1154978.html
Copyright © 2011-2022 走看看