数字转换成大写金额

来源:互联网 发布:洛杉矶级核潜艇数据 编辑:程序博客网 时间:2024/05/01 04:09

                                                    数字转换成大写金额

using System;

namespace  NumToCap
{
 /// <summary>
 /// 类名:NumToCaps
 /// 功能:将数字转换大写 如:101.01->壹佰零壹元零壹分
 /// 限制:数字为万万亿以内,小数不超过两位
 /// 用法:NumToCap cap=new NumToCap();
 ///      String s=cap.GetCaps(d);
 /// 日期:2005-6-26
 /// 作者:dqjia
 /// 壹贰叁肆伍陆柒捌玖拾
 ///千百万亿
 /// </summary>
 public class NumToCaps
 {
  public NumToCaps()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }
  ///<summary>
  ///将数定转换大写金额格式
  ///<param name= "d" > 参数必须小于万万亿,且不超过两位小数多过两位自动截取两位
  ///</param>
  ///<results>返回大写金额</results>
  ///</summary>
  public string GetCaps(decimal d)
  {
   string s=d.ToString ("####.00");
   bool isNeg=false;
      string cap="";
   
   if((d<1&&d>0)||(d<0&&d>-1)||d==0)
   {
    return this.ProcSpecNum (s);
   }
   if(d<0)
   {
    isNeg=true;
    s=s.TrimStart ('-');
   }
   if(s.Length!=0&&s.Length <=19)
   {
    s=s.PadLeft (19,'0');
    int i,j=0;
    for(i=0;i<4;i++)
    {
     //处理万亿
     if(i==1&&cap !="零"&&(s.Substring (j,4))=="0000")
     {
      
      cap+="亿";
     }
     cap+=this.GetIntCap  (s.Substring (j,4),i.ToString ());
     j+=4;
    }
    cap=this.ProcZero (cap);
    cap+="元";
    cap+=GetDecimalCap (s.Substring (17,2));
    if(isNeg)
    {
     cap="负"+cap;
    }
       
   }
   else
   {
    throw new Exception ("输入值超出范围!");
   }
   return cap;
   

  }
  /// <summary>
  /// 处理特殊数字如小数和负小数,零.
  /// </summary>
  /// <param name="num"></param>
  /// <returns></returns>
  private string ProcSpecNum(string num)
  {
   decimal dec=decimal.Parse (num);
   if(dec==0)
   {
    return "零元";
   }
   if(dec<1&&dec>0)
   {
    return this.GetDecimalCap (num.Substring (num.IndexOf ('.')+1,2)).Trim ('零');
   }
   if(dec<0&&dec>-1)
   {
    return "负"+this.GetDecimalCap (num.Substring (num.IndexOf ('.')+1,2)).Trim ('零');
   }
   else
    return "";
  }
  /// <summary>
  /// 处理整数部分
  /// </summary>
  /// <param name="intPart">参数为四个数字为一组的字符串</param>
  /// <param name="level">表示该字符串是万亿,亿,万等信息</param>
  /// <returns>此字符串的大写</returns>
  private string GetIntCap(string intPart,string level)
  {
   string cap="";
   if(intPart!="0000")
   {
    int i;
    string temp;
    for(i=0;i<4;i++)
    {
     temp=this.GetOneNumCap (intPart.Substring (i,1));
     if(temp!="零")
     {
      temp+=this.GetCapUnit (i.ToString ());
     }
     cap+=temp;
     
    }
    cap=cap.TrimEnd ('零');
    cap+=this.GetLevel (level);
   }
   else
   {
    cap="零";
   }
   return cap;
  }
  /// <summary>
  /// 取得小数部分的大写表示
  /// </summary>
  /// <param name="decimalPart"></param>
  /// <returns></returns>
  private string GetDecimalCap(string decimalPart)
  {
   string s="";
   string temp;
   if(decimalPart!="00")
   {
    temp=this.GetOneNumCap (decimalPart.Substring (0,1));
    if(temp!="零")
    {
     s=temp+"角";
    }
    else
    {
     s=temp;
    }
    temp=this.GetOneNumCap (decimalPart.Substring (1,1));
    if(temp!="零")
    {
     s=s+temp+"分";
    }
   }
   else
   {
    s="整";
   }
   return s;
  }
  /// <summary>
  /// 取得单个数字的大写
  /// </summary>
  /// <param name="oneNum"></param>
  /// <returns></returns>
  private string GetOneNumCap(string oneNum)
  {
   string capsNum="";
   if(oneNum.Length==1)
   {
    switch(oneNum)
    {
     case "1":
      capsNum="壹";
      break;
     case "2":
      capsNum="贰";
      break;
     case "3":
      capsNum="叁";
      break;
     case "4":
      capsNum="肆";
      break;
     case "5":
      capsNum="伍";
      break;
     case "6":
      capsNum="陆";
      break;
     case "7":
      capsNum="柒";
      break;
     case "8":
      capsNum="捌";
      break;
     case "9":
      capsNum="玖";
      break;
     case "0":
      capsNum="零";
      break;
     default:
      break;
    }
   }
   return capsNum;
  }
  

  
  private string GetCapUnit(string unit)
  {
   string s="";
   switch(unit)
   {
    case "0":
     s="千";
     break;
    case "1":
     s="百";
     break;
    case "2":
     s="拾";
     break;
    default:
     break;

   }
   return s;
  }
  private string GetLevel(string level)
  {
   string s="";
   switch(level)
   {
    case "0":
     s="万";
     break;
    case "1":
     s="亿";
     break;
    case "2":
     s="万";
     break;
    default:
     break;

   }
   return s;
  }
  /// <summary>
  /// 处理多个连续零的情况
  /// </summary>
  /// <param name="s"></param>
  /// <returns></returns>
  private string ProcZero(string s)
  {
   s=s.Trim ('零');
   
    do
   {
    s=s.Replace ("零零","零");
   }
    while(s.IndexOf ("零零")>0);
   
   return s;
  }
 }
 
}