把金额转换为汉字表达式C#代码

jopen 10年前

/* 创建者:菜刀居士的博客   * 创建日期: 2014年09月04号   * 功能:Money类型转换   *   */    namespace Net.String.ConsoleApplication  {      using System;      using System.Collections.Generic;         public class MoneyHelper      {          public static string[] chineseDigits = new string[] { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };            /// <summary>          /// 把金额转换为汉字表示的数量,小数点后四舍五入保留两位          /// </summary>          /// <param name="amount">小写金额</param>          /// <returns>人民币大写</returns>          public static string amountToChinese(decimal amount)          {              if (amount > 99999999999999.99m || amount < -99999999999999.99m)              {                  throw new Exception("参数值超出允许范围 (-99999999999999.99 ~ 99999999999999.99)!");              }              // 如果是负数,先转换为正数              bool negative = false;              if (amount < 0)              {                  negative = true;                  amount = amount * (-1);              }              // 乘以100再进行四舍五入,实现小数保留2位              decimal temp_r = Round(amount, 2);              int temp = Convert.ToInt32(temp_r * 100);              int numFen = (int)(temp % 10);    // 分              temp = temp / 10;              int numJiao = (int)(temp % 10);   // 角              temp = temp / 10;              // temp 目前是金额的整数部分              //              int[] parts = new int[20]; // 其中的元素是把原来金额整数部分分割为值在 0~9999 之间的数的各个部分              int numParts = 0;          // 记录把原来金额整数部分分割为了几个部分(每部分都在 0~9999 之间)              for (int i = 0; ; i++)              {                  if (temp == 0)                  {                      break;                  }                  int part = (int)(temp % 10000);                  parts[i] = part;                  numParts++;                  temp = temp / 10000;              }              //              bool beforeWanIsZero = true; // 标志“万”下面一级是不是 0              string chineseStr = "";              for (int i = 0; i < numParts; i++)              {                  string partChinese = partTranslate(parts[i]);                    if (i % 2 == 0)                  {                      if ("".Equals(partChinese))                      {                          beforeWanIsZero = true;                      }                      else                      {                          beforeWanIsZero = false;                      }                  }                    if (i != 0)                  {                      if (i % 2 == 0)                      {                          chineseStr = "亿" + chineseStr;                      }                      else                      {                          // 如果“万”对应的part为0,而“万”下面一级不为0,则不加“万”,而加“零”                          if ("".Equals(partChinese) && !beforeWanIsZero)                          {                              chineseStr = "零" + chineseStr;                          }                          else                          {                              // 如果"万"的部分不为0,而"万"前面的部分小于1000大于0,则万后面应该跟“零”                              if (parts[i - 1] < 1000 && parts[i - 1] > 0)                              {                                  chineseStr = "零" + chineseStr;                              }                              chineseStr = "万" + chineseStr;                          }                      }                  }                  chineseStr = partChinese + chineseStr;              }                // 最后处理              if ("".Equals(chineseStr))  // 整数部分为 0, 则表达为"零元"              {                  chineseStr = chineseDigits[0];              }              else if (negative)          // 整数部分不为 0, 并且原金额为负数              {                  chineseStr = "负" + chineseStr;              }              chineseStr = chineseStr + "元";              if ((numFen == 0) && (numJiao == 0))              {                  chineseStr = chineseStr + "整";              }              else if (numFen == 0)  // 0 分,角数不为 0              {                  chineseStr = chineseStr + chineseDigits[numJiao] + "角";              }              else                   // “分”数不为 0              {                  if (numJiao == 0)                  {                      chineseStr = chineseStr + "零" + chineseDigits[numFen] + "分";                  }                  else                  {                      chineseStr = chineseStr + chineseDigits[numJiao] + "角" + chineseDigits[numFen] + "分";                  }              }              return chineseStr;          }            /// <summary>          /// 把一个 0~9999 之间的整数转换为汉字的字符串,如果是 0 则返回 ""          /// </summary>          /// <param name="amountPart"></param>          /// <returns></returns>          public static string partTranslate(int amountPart)          {              if (amountPart < 0 || amountPart >= 10000)              {                  throw new Exception("参数必须是大于等于 0,小于 10000 的整数!");              }                string[] units = new string[] { "", "拾", "佰", "仟" };                int temp = amountPart;                string amountStr = amountPart.ToString();              int amountStrLength = amountStr.Length;                bool lastIsZero = true; // 在从低位往高位循环时,记录上一位数字是不是 0              string chineseStr = "";                for (int i = 0; i < amountStrLength; i++)              {                  if (temp == 0) // 高位已无数据                  {                      break;                  }                  int digit = temp % 10;                  if (digit == 0) // 取到的数字为 0                  {                      if (!lastIsZero) // 前一个数字不是 0,则在当前汉字串前加“零”字;                      {                          chineseStr = "零" + chineseStr;                      }                      lastIsZero = true;                  }                  else   // 取到的数字不是 0                  {                      chineseStr = chineseDigits[digit] + units[i] + chineseStr;                      lastIsZero = false;                  }                  temp = temp / 10;              }              return chineseStr;          }            public static decimal Round(decimal data, int digits)          {              double i = Math.Pow(10, digits);              decimal temp = (data * (decimal)(i));              int intData = (int)temp;              decimal digData = temp - intData;                if (digData >= decimal.Parse("0.5"))                  intData++;              string format = digits > 0 ? "0." : "0";              for (int n = 0; n < digits; n++)              {                  format += "0";              }              return Convert.ToDecimal(((decimal)(intData / i)).ToString(format));            }                   /// <summary>          /// 把金额转换为汉字表示          /// </summary>          public static string RMBEncode(decimal num)          {              try              {                  #region                  string str1 = "零壹贰叁肆伍陆柒捌玖";            //0-9所对应的汉字                  string str2 = "万仟佰拾亿仟佰拾万仟佰拾元角分"; //数字位所对应的汉字                  string str3 = "";    //从原num值中取出的值                  string str4 = "";    //数字的字符串形式                  string str5 = "";  //人民币大写金额形式                  int i;    //循环变量                  int j;    //num的值乘以100的字符串长度                  string ch1 = "";    //数字的汉语读法                  string ch2 = "";    //数字位的汉字读法                  int nzero = 0;  //用来计算连续的零值是几个                  int temp;            //从原num值中取出的值                    num = Math.Round(Math.Abs(num), 2);    //将num取绝对值并四舍五入取2位小数                  str4 = ((long)(num * 100)).ToString();        //将num乘100并转换成字符串形式                  j = str4.Length;      //找出最高位                  if (j > 15) { return "溢出"; }                  str2 = str2.Substring(15 - j);   //取出对应位数的str2的值。如:200.55,j为5所以str2=佰拾元角分                    #endregion                  //循环取出每一位需要转换的值                  for (i = 0; i < j; i++)                  {                      #region                      str3 = str4.Substring(i, 1);          //取出需转换的某一位的值                      temp = Convert.ToInt32(str3);      //转换为数字                      if (i != (j - 3) && i != (j - 7) && i != (j - 11) && i != (j - 15))                      {                          #region                          if (str3 == "0")                          {                              ch1 = "";                              ch2 = "";                              nzero = nzero + 1;                          }                          else                          {                              if (str3 != "0" && nzero != 0)                              {                                  ch1 = "零" + str1.Substring(temp * 1, 1);                                  ch2 = str2.Substring(i, 1);                                  nzero = 0;                              }                              else                              {                                  ch1 = str1.Substring(temp * 1, 1);                                  ch2 = str2.Substring(i, 1);                                  nzero = 0;                              }                          }                          #endregion                      }                      else                      {                          #region                          if (str3 != "0" && nzero != 0)                          {                              ch1 = "零" + str1.Substring(temp * 1, 1);                              ch2 = str2.Substring(i, 1);                              nzero = 0;                          }                          else                          {                              if (str3 != "0" && nzero == 0)                              {                                  ch1 = str1.Substring(temp * 1, 1);                                  ch2 = str2.Substring(i, 1);                                  nzero = 0;                              }                              else                              {                                  #region                                  if (str3 == "0" && nzero >= 3)                                  {                                      ch1 = "";                                      ch2 = "";                                      nzero = nzero + 1;                                  }                                  else                                  {                                      if (j >= 11)                                      {                                          ch1 = "";                                          nzero = nzero + 1;                                      }                                      else                                      {                                          ch1 = "";                                          ch2 = str2.Substring(i, 1);                                          nzero = nzero + 1;                                      }                                  }                                  #endregion                              }                          }                          #endregion                      }                      if (i == (j - 11) || i == (j - 3))                      {                          ch2 = str2.Substring(i, 1);                      }                      str5 = str5 + ch1 + ch2;                        if (i == j - 1 && str3 == "0")                      {                          str5 = str5 + '整';                      }                      #endregion                  }                  if (num == 0)                  {                      str5 = "零元整";                  }                  return str5;              }              catch              {                  return "非法数据";              }          }               }  }