在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

Java实现人民币大写精讲

2017-2-7 13:41| 发布者: zhangjf| 查看: 492| 评论: 0

摘要: 原文 http://www.cnblogs.com/tufujie/p/5081229.html 想要实现人民币大写,在发票等场景中使用?? 1234.56显示为:壹仟贰佰叁拾肆元伍角陆分,那就往下看看吧! 本程序可以实现 0 到 9999 9999 9999.994 以 ...
原文 http://www.cnblogs.com/tufujie/p/5081229.html

想要实现人民币大写,在发票等场景中使用?? 1234.56显示为:壹仟贰佰叁拾肆元伍角陆分,那就往下看看吧!

本程序可以实现 0 到 9999 9999 9999.994 以内的人民币大写转换,精确到分

经典测试数据:

0

希望转换出来的结果为:

零元零角零分

1234

希望转换出来的结果为:

壹仟贰佰叁拾肆元零角零分

9999

希望转换出来的结果为:

玖仟玖佰玖拾玖元零角零分

1234.5

希望转换出来的结果为:

壹仟贰佰叁拾肆元伍角零分

1234.9

希望转换出来的结果为:

壹仟贰佰叁拾肆元玖角零分

1234.56

希望转换出来的结果为:

壹仟贰佰叁拾肆元伍角陆分

1234.99

希望转换出来的结果为:

壹仟贰佰叁拾肆元玖角玖分

1234.994

希望转换出来的结果为:

壹仟贰佰叁拾肆元玖角玖分

1234.999

希望转换出来的结果为:

壹仟贰佰叁拾伍元零角零分

999999999999.999

希望转换出来的结果为:

数据过大,无法进行转换,请重新输入!

程序源码如下,含注释:
  1. package com.tfj.algorithm;
  2. import java.util.Scanner;
  3. public class RenMingBi {
  4. private boolean zero;
  5. String[] strHan = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
  6. String[] moneyCount = { "", "拾", "佰", "仟" };
  7. RenMingBi() {
  8. zero = false;
  9. }
  10. private String[] divide(double digitalRmbValue) {
  11. // 处理整数
  12. long intPart = (long) (digitalRmbValue);
  13. // 处理小数,把小数转换成整数形式处理,并进行四舍五入,此时小数四舍五入之后为100的应该另外加一层处理
  14. long decimalPart = Math
  15. .round((double) Math.round((digitalRmbValue - intPart) * 10000) / 100);
  16. // System.out.println("整数部分为:" + intPart + "小数部分为:" + (digitalRmbValue - intPart));
  17. if (decimalPart == 100) {
  18. intPart += 1;
  19. }
  20. // System.out.println("四舍五入之后整数部分为:" + intPart + "小数部分为:" + decimalPart);
  21. String strIntPart = "";
  22. if (intPart == 0)
  23. strIntPart = "0";
  24. else {
  25. strIntPart = "" + intPart;
  26. }
  27. String strDecimalPart = "";
  28. if (decimalPart < 10 && decimalPart >= 0)
  29. strDecimalPart = "0" + decimalPart;
  30. else {
  31. strDecimalPart = "" + decimalPart;
  32. }
  33. // 处理输入为0的时候
  34. if (intPart == 0 && decimalPart == 0) {
  35. zero = true;
  36. }
  37. // System.out.println("准换为String后,整数部分为:" + strIntPart + "小数部分为:" + strDecimalPart);
  38. return new String[] { strIntPart, strDecimalPart };
  39. }
  40. // 用来转换小数部分
  41. private String transDecimal(String str) {
  42. if (str.equals("100") || str.equals("00")) {
  43. return "零角零分";
  44. } else {
  45. String strResult;
  46. char[] strRmb = new char[20];
  47. strRmb = str.toCharArray();
  48. if (strRmb[0] == '0' && strRmb[1] == '0') {
  49. strResult = "";
  50. } else {
  51. int dm = strRmb[0] - '0';
  52. int dn = strRmb[1] - '0';
  53. strResult = strHan[dm] + "角" + strHan[dn] + "分";
  54. }
  55. return strResult;
  56. }
  57. }
  58. // 用来转换整数部分
  59. private String transInt(String str) {
  60. char[] firstFourBitRmb = new char[20];
  61. firstFourBitRmb = str.toCharArray();
  62. int len = firstFourBitRmb.length;
  63. String strResult = "";
  64. for (int i = 0; i < len; i++) {
  65. /**
  66. * 这里开启之后会显示成通俗易懂的格式,例如1001,会转化为:壹仟零壹元,而不是:壹仟零佰零拾壹元, 但我希望得到的是后面这种,因为发票所需显示的就是后面这种
  67. **/
  68. // if (firstFourBitRmb[i] == '0' && i < len) {
  69. // boolean zeroFlag = false;
  70. // while (i < len && firstFourBitRmb[i] == '0') {
  71. // zeroFlag = true;
  72. // i++;
  73. // }
  74. // if (i != len && zeroFlag == true)
  75. // strResult += "零";
  76. // i--;
  77. // } else {
  78. // int m = firstFourBitRmb[i] - '0';
  79. // strResult += strHan[m] + moneyCount[len - i - 1];
  80. // }
  81. int m = firstFourBitRmb[i] - '0';
  82. strResult += strHan[m] + moneyCount[len - i - 1];
  83. }
  84. return strResult;
  85. }
  86. public String transComb() {
  87. String[] strTempRmb = new String[2];
  88. double strValue = 0D;
  89. Scanner sc = new Scanner(System.in);
  90. System.out.println("请输入具体金额,结果会精确到分:");
  91. strValue = sc.nextDouble();
  92. RenMingBi nr = new RenMingBi();
  93. strTempRmb = nr.divide(strValue);
  94. // 转换小数部分
  95. String result1 = nr.transDecimal(strTempRmb[1]);
  96. // 转换整数部分
  97. String result2 = "";
  98. int len = strTempRmb[0].length();
  99. if (len > 12)
  100. return "数据过大,无法进行转换,请重新输入!";
  101. else {
  102. if (len >= 9) {
  103. String strBit1 = strTempRmb[0].substring(0, len - 8);
  104. String strBit2 = strTempRmb[0].substring(len - 8, len - 4);
  105. String strBit3 = strTempRmb[0].substring(len - 4, len);
  106. String strResult1 = nr.transInt(strBit1) + "亿";
  107. String strResult2 = nr.transInt(strBit2) + "万";
  108. String strResult3 = nr.transInt(strBit3) + "元";
  109. result2 = strResult1 + strResult2 + strResult3;
  110. } else if (len >= 5) {
  111. String strBit1 = strTempRmb[0].substring(0, len - 4);
  112. String strBit2 = strTempRmb[0].substring(len - 4, len);
  113. String strResult1 = nr.transInt(strBit1) + "万";
  114. String strResult2 = nr.transInt(strBit2) + "元";
  115. result2 = strResult1 + strResult2;
  116. } else if (len >= 1) {
  117. if (nr.zero == true) {
  118. result2 = "零元";
  119. } else
  120. result2 = nr.transInt(strTempRmb[0]) + "元";
  121. }
  122. return result2 + result1;
  123. }
  124. }
  125. public static void main(String[] args) {
  126. RenMingBi rmb = new RenMingBi();
  127. while (true) {
  128. System.out.println(rmb.transComb());
  129. }
  130. }
  131. }
复制代码

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-7-9 06:44

Copyright 2015-2025 djqfx

返回顶部