RMB.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. using System;
  2. namespace Ant.Service.Utilities
  3. {
  4. /// <summary>
  5. /// Rmb 的摘要说明。
  6. /// </summary>
  7. public class Rmb
  8. {
  9. /// <summary>
  10. /// 转换人民币大小金额
  11. /// </summary>
  12. /// <param name="num">金额</param>
  13. /// <returns>返回大写形式</returns>
  14. public static string CmycurD(decimal num)
  15. {
  16. string str1 = "零壹贰叁肆伍陆柒捌玖"; //0-9所对应的汉字
  17. string str2 = "万仟佰拾亿仟佰拾万仟佰拾元角分"; //数字位所对应的汉字
  18. string str3 = ""; //从原num值中取出的值
  19. string str4 = ""; //数字的字符串形式
  20. string str5 = ""; //人民币大写金额形式
  21. int i; //循环变量
  22. int j; //num的值乘以100的字符串长度
  23. string ch1 = ""; //数字的汉语读法
  24. string ch2 = ""; //数字位的汉字读法
  25. int nzero = 0; //用来计算连续的零值是几个
  26. int temp; //从原num值中取出的值
  27. num = Math.Round(Math.Abs(num), 2); //将num取绝对值并四舍五入取2位小数
  28. str4 = ((long)(num * 100)).ToString(); //将num乘100并转换成字符串形式
  29. j = str4.Length; //找出最高位
  30. if (j > 15) { return "溢出"; }
  31. str2 = str2.Substring(15 - j); //取出对应位数的str2的值。如:200.55,j为5所以str2=佰拾元角分
  32. //循环取出每一位需要转换的值
  33. for (i = 0; i < j; i++)
  34. {
  35. str3 = str4.Substring(i, 1); //取出需转换的某一位的值
  36. temp = Convert.ToInt32(str3); //转换为数字
  37. if (i != (j - 3) && i != (j - 7) && i != (j - 11) && i != (j - 15))
  38. {
  39. //当所取位数不为元、万、亿、万亿上的数字时
  40. if (str3 == "0")
  41. {
  42. ch1 = "";
  43. ch2 = "";
  44. nzero = nzero + 1;
  45. }
  46. else
  47. {
  48. if (str3 != "0" && nzero != 0)
  49. {
  50. ch1 = "零" + str1.Substring(temp * 1, 1);
  51. ch2 = str2.Substring(i, 1);
  52. nzero = 0;
  53. }
  54. else
  55. {
  56. ch1 = str1.Substring(temp * 1, 1);
  57. ch2 = str2.Substring(i, 1);
  58. nzero = 0;
  59. }
  60. }
  61. }
  62. else
  63. {
  64. //该位是万亿,亿,万,元位等关键位
  65. if (str3 != "0" && nzero != 0)
  66. {
  67. ch1 = "零" + str1.Substring(temp * 1, 1);
  68. ch2 = str2.Substring(i, 1);
  69. nzero = 0;
  70. }
  71. else
  72. {
  73. if (str3 != "0" && nzero == 0)
  74. {
  75. ch1 = str1.Substring(temp * 1, 1);
  76. ch2 = str2.Substring(i, 1);
  77. nzero = 0;
  78. }
  79. else
  80. {
  81. if (str3 == "0" && nzero >= 3)
  82. {
  83. ch1 = "";
  84. ch2 = "";
  85. nzero = nzero + 1;
  86. }
  87. else
  88. {
  89. if (j >= 11)
  90. {
  91. ch1 = "";
  92. nzero = nzero + 1;
  93. }
  94. else
  95. {
  96. ch1 = "";
  97. ch2 = str2.Substring(i, 1);
  98. nzero = nzero + 1;
  99. }
  100. }
  101. }
  102. }
  103. }
  104. if (i == (j - 11) || i == (j - 3))
  105. {
  106. //如果该位是亿位或元位,则必须写上
  107. ch2 = str2.Substring(i, 1);
  108. }
  109. str5 = str5 + ch1 + ch2;
  110. if (i == j - 1 && str3 == "0")
  111. {
  112. //最后一位(分)为0时,加上“整”
  113. str5 = str5 + '整';
  114. }
  115. }
  116. if (num == 0)
  117. {
  118. str5 = "零元整";
  119. }
  120. return str5;
  121. }
  122. /**/
  123. /// <summary>
  124. /// 一个重载,将字符串先转换成数字在调用CmycurD(decimal num)
  125. /// </summary>
  126. /// <param name="num">用户输入的金额,字符串形式未转成decimal</param>
  127. /// <returns></returns>
  128. public static string CmycurD(string numstr)
  129. {
  130. try
  131. {
  132. decimal num = Convert.ToDecimal(numstr);
  133. return CmycurD(num);
  134. }
  135. catch
  136. {
  137. return "非数字形式!";
  138. }
  139. }
  140. }
  141. }