[C#] C#数字转换成大写人民币金额 →→→→→进入此内容的聊天室

来自 , 2019-06-02, 写在 C#, 查看 119 次.
URL http://www.code666.cn/view/608b30e4
  1. // 数字转换成大写金额
  2. // 例如:(new Money(200)).ToString() == "贰佰元"
  3. namespace Skyiv.Util
  4. {
  5.   using System.Text;
  6.   class Test
  7.   {
  8.     static void Main()
  9.     {
  10.       for (;;)
  11.       {
  12.         System.Console.Write("金额: ");
  13.         string  s = System.Console.ReadLine();
  14.         decimal m;
  15.         try   { m = decimal.Parse(s); }
  16.         catch { break; }
  17.         System.Console.WriteLine("大写: " + new Money(m));
  18.       }
  19.     }
  20.   }
  21.   // 该类重载的 ToString() 方法返回的是大写金额字符串
  22.   class Money
  23.   {
  24.     public string Yuan  = "元";                        // “元”,可以改为“圆”、“卢布”之类
  25.     public string Jiao  = "角";                        // “角”,可以改为“拾”
  26.     public string Fen   = "分";                        // “分”,可以改为“美分”之类
  27.     static string Digit = "零壹贰叁肆伍陆柒捌玖";      // 大写数字
  28.     bool   isAllZero    = true;                        // 片段内是否全零
  29.     bool   isPreZero    = true;                        // 低一位数字是否是零
  30.     bool   Overflow     = false;                       // 溢出标志
  31.     long   money100;                                   // 金额*100,即以“分”为单位的金额
  32.     long   value;                                      // money100的绝对值
  33.     StringBuilder sb    = new StringBuilder();         // 大写金额字符串,逆序
  34.     // 只读属性: "零元"
  35.     public string ZeroString
  36.     {
  37.       get { return Digit[0] + Yuan; }
  38.     }
  39.     // 构造函数
  40.     public Money(decimal money)
  41.     {
  42.       try   { money100 = (long)(money * 100m); }
  43.       catch { Overflow = true; }
  44.       if (money100 == long.MinValue) Overflow = true;
  45.     }
  46.     // 重载 ToString() 方法,返回大写金额字符串
  47.     public override string ToString()
  48.     {
  49.       if (Overflow) return "金额超出范围";
  50.       if (money100 == 0) return ZeroString;
  51.       string [] Unit = { Yuan, "万", "亿", "万", "亿亿" };
  52.       value = System.Math.Abs(money100);
  53.       ParseSection(true);
  54.       for (int i = 0; i < Unit.Length && value > 0; i++)
  55.       {
  56.         if (isPreZero && !isAllZero) sb.Append(Digit[0]);
  57.         if (i == 4 && sb.ToString().EndsWith(Unit[2]))
  58.           sb.Remove(sb.Length - Unit[2].Length, Unit[2].Length);
  59.         sb.Append(Unit[i]);
  60.         ParseSection(false);
  61.         if ((i % 2) == 1 && isAllZero)
  62.           sb.Remove(sb.Length - Unit[i].Length, Unit[i].Length);
  63.       }
  64.       if (money100 < 0) sb.Append("负");
  65.       return Reverse();
  66.     }
  67.     // 解析“片段”: “角分(2位)”或“万以内的一段(4位)”
  68.     void ParseSection(bool isJiaoFen)
  69.     {
  70.       string [] Unit = isJiaoFen ?
  71.         new string [] { Fen, Jiao } :
  72.         new string [] { "", "拾", "佰", "仟" };
  73.       isAllZero = true;
  74.       for (int i = 0; i < Unit.Length && value > 0; i++)
  75.       {
  76.         int d = (int)(value % 10);
  77.         if (d != 0)
  78.         {
  79.           if (isPreZero && !isAllZero) sb.Append(Digit[0]);
  80.           sb.AppendFormat("{0}{1}", Unit[i], Digit[d]);
  81.           isAllZero = false;
  82.         }
  83.         isPreZero = (d == 0);
  84.         value /= 10;
  85.       }
  86.     }
  87.     // 反转字符串
  88.     string Reverse()
  89.     {
  90.       StringBuilder sbReversed = new StringBuilder();
  91.       for (int i = sb.Length - 1; i >= 0; i--)
  92.         sbReversed.Append(sb[i]);
  93.       return sbReversed.ToString();
  94.     }
  95.   }
  96. }
  97.  
  98. //csharp/799

回复 "C#数字转换成大写人民币金额"

这儿你可以回复上面这条便签

captcha