RMB.cs 5.3 KB

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