1. 程式人生 > >JAVA的人民幣大寫(金額)轉化

JAVA的人民幣大寫(金額)轉化

  在專案開發過程中偶爾會遇到需要把人民幣金額由數字轉換成大寫金額的形式,例如,將“123456”轉換成“壹拾貳萬叄千肆百伍拾陸”這樣子,這種情況在程式需要列印一些單據時會普遍用到,而下面一個程式就解決了這個問題,如果大家覺得有用,請一定幫我頂起來啊^-^,另外,希望各網友也將自己的類似的處理程式拿出來分享。

  1. import java.text.DecimalFormat;
  2. import java.text.NumberFormat;
  3. //總體思路:
  4. //對數字進行分級處理,級長為4
  5. //對分級後的每級分別處理,處理後得到字串相連
  6. //如:123456=12|3456
  7. //第二級:12=壹拾貳 + “萬”
  8. //第一級:3456 =叄千肆百伍拾陸 + “”
  9. publicfinalclass RMB {
  10. privatedouble amount = 0.0D;
  11. privatestaticfinal String NUM = "零壹貳叄肆伍陸柒捌玖";
  12. privatestaticfinal String UNIT = "仟佰拾個";
  13. privatestaticfinal String GRADEUNIT = "仟萬億兆";
  14. privatestaticfinal String DOTUNIT = "角分釐";
  15. privatestaticfinalint GRADE = 4;
  16. privatestaticfinal
     String SIGN = "¥";
  17. privatestaticfinal NumberFormat nf = new DecimalFormat("#0.###");
  18. public RMB(double amount) {
  19. this.amount = amount;
  20.   }
  21. public String toBigAmt(){
  22. return toBigAmt(this.amount);
  23.   }
  24. publicstatic String toBigAmt(double amount){
  25.     String amt = nf.format(amount);
  26.     Double d = new Double(amount);
  27.     String dotPart = ""//取小數位
  28.     String intPart = ""//取整數位
  29. int dotPos;
  30. if ( (dotPos = amt.indexOf('.')) != -1) {
  31.       intPart = amt.substring(0, dotPos);
  32.       dotPart = amt.substring(dotPos + 1);
  33.     }
  34. else {
  35.       intPart = amt;
  36.     }
  37. if(intPart.length() > 16thrownew java.lang.InternalError("The amount is too big.");
  38.     String intBig = intToBig(intPart);
  39.     String dotBig = dotToBig(dotPart);
  40. //以下程式碼稍做修改,現在是完美的程式碼啦!
  41. if ((dotBig.length() == 0)&&(intBig.length() != 0)) {
  42. return intBig + "元整";
  43.     }elseif((dotBig.length() == 0)&&(intBig.length() == 0)){
  44. return intBig + "零元";  
  45.     }elseif((dotBig.length() != 0)&&(intBig.length() != 0)) {
  46. return intBig + "元" + dotBig;
  47.     }else{
  48. return dotBig;  
  49.     }
  50. /*
  51.     if(dotBig.length() == 0) return intBig +"元整";
  52.     else return intBig + "元" + dotBig;
  53. */
  54.   }
  55. privatestatic String dotToBig(String dotPart){
  56. //得到轉換後的大寫(小數部分)
  57.     String strRet = "";
  58. for(int i=0; i<dotPart.length() && i<3; i++){
  59. int num;
  60. if((num = Integer.parseInt(dotPart.substring(i,i+1))) != 0)
  61.         strRet += NUM.substring(num,num+1) + DOTUNIT.substring(i,i+1);
  62.     }
  63. return strRet;
  64.   }
  65. privatestatic String intToBig(String intPart){
  66. //得到轉換後的大寫(整數部分)
  67. int grade; //級長
  68.       String result = "";
  69.       String strTmp = "";
  70. //得到當級長
  71.       grade = intPart.length() / GRADE;
  72. //調整級次長度
  73. if(intPart.length() % GRADE != 0) grade += 1;
  74. //對每級數字處理
  75. for(int i = grade; i >= 1; i--){
  76.           strTmp = getNowGradeVal(intPart, i);//取得當前級次數字
  77.           result += getSubUnit(strTmp);//轉換大寫
  78.           result = dropZero(result);//除零
  79. //加級次單位
  80. if( i>1 ) //末位不加單位
  81. //單位不能相連續
  82. if(getSubUnit(strTmp).equals("零零零零")){
  83.                   result += "零"+GRADEUNIT.substring(i - 1, i);
  84.               }else{
  85.                   result += GRADEUNIT.substring(i - 1, i);
  86.               }
  87.       }
  88. return result;
  89.   }
  90. privatestatic String getNowGradeVal(String strVal,int grade){
  91. //得到當前級次的串
  92.       String rst;
  93. if(strVal.length() <= grade * GRADE)
  94.           rst = strVal.substring(0,strVal.length() - (grade-1)*GRADE);
  95. else
  96.           rst = strVal.substring(strVal.length() - grade*GRADE,strVal.length() - (grade-1)*GRADE);
  97. return rst;
  98.   }
  99. privatestatic String getSubUnit(String strVal){
  100. //數值轉換
  101.       String rst = "";
  102. for(int i = 0;i< strVal.length(); i++){
  103.           String s = strVal.substring(i,i+1);
  104. int num = Integer.parseInt(s);
  105. if(num == 0){
  106. //“零”作特殊處理
  107. if(i != strVal.length()) //轉換後數末位不能為零
  108.                   rst += "零";
  109.           }else{
  110. //If IntKey = 1 And i = 2 Then
  111. //“壹拾”作特殊處理
  112. //“壹拾”合理
  113. //Else
  114.                   rst += NUM.substring(num,num+1);
  115. //End If
  116. //追加單位
  117. if(i != strVal.length()-1 )//個位不加單位
  118.                 rst += UNIT.substring(i+4-strVal.length(),i+4-strVal.length()+1);
  119.           }
  120.       }
  121. return rst;
  122.   }
  123. privatestatic String dropZero(String strVal){
  124. //去除連繼的“零”
  125.       String strRst;
  126.       String strBefore; //前一位置字元
  127.       String strNow;    //現在位置字元
  128.       strBefore = strVal.substring(0,1);
  129.       strRst = strBefore;
  130. for(int i= 1; i<strVal.length(); i++) {
  131.           strNow = strVal.substring(i, i+1);
  132. if(strNow.equals("零") && strBefore.equals("零"))
  133.               ;//同時為零
  134. else
  135.               strRst += strNow;
  136.           strBefore = strNow;
  137.       }
  138. //末位去零
  139. if(strRst.substring(strRst.length()-1, strRst.length()).equals("零"))
  140.         strRst = strRst.substring(0,strRst.length()-1);
  141. return strRst;
  142.   }
  143. publicstaticvoid main(String[] args) {
  144.     System.out.println(RMB.toBigAmt(10052345.00D));
  145.     System.out.println(RMB.toBigAmt(0.00D));
  146.     System.out.println(RMB.toBigAmt(0.60D));
  147.     System.out.println(RMB.toBigAmt(00.60D));
  148.     System.out.println(RMB.toBigAmt(150.2101D));
  149.     System.out.println(RMB.toBigAmt(15400089666.234D));
  150.     System.out.println(RMB.toBigAmt(22200004444.2347D));
  151.   }