文章分类

站点统计

  • 分类总数: 13 个
  • 文章总数: 145 篇
  • 评论总数: 47 条
  • 附件总数: 59 个
  • 建站日期: 2008-08-18
  • 访问总数: 472872 人次
  • RSS订阅: 文章|评论

人民币大写金额转换代码(Java)

Admin 于 2008-08-23 03:31:13 发表Java

订阅: http://www.kaiyuan8.org/Feed/Article_6.aspx
引用: 点这里获取地址 (UTF-8)
使用pack200压缩jar文件 < 人民币大写金额转换代码(Java) > 批处理几点

在程序开发过程中偶尔会遇到需要把人民币金额由数字转换成大写金额的形式,例如,将“123456”转换成“壹拾贰万叁千肆百伍拾陆”这样子,这种情况在程序需要打印一些单据时会普遍用到,而下面一个程序就解决了这个问题:

 

  1. import java.text.DecimalFormat; 
  2. import java.text.NumberFormat; 
  3.  
  4. //总体思路: 
  5. //对数字进行分级处理,级长为4 
  6. //对分级后的每级分别处理,处理后得到字符串相连 
  7. //如:123456=12|3456 
  8. //第二级:12=壹拾贰 + “万” 
  9. //第一级:3456 =叁千肆百伍拾陆 + “” 
  10.  
  11. public final class RMB { 
  12.   private double amount = 0.0D; 
  13.   private static final String NUM = "零壹贰叁肆伍陆柒捌玖"
  14.   private static final String UNIT = "仟佰拾个"
  15.   private static final String GRADEUNIT = "仟万亿兆"
  16.   private static final String DOTUNIT = "角分厘"
  17.   private static final int GRADE = 4
  18.   private static final String SIGN = "¥"
  19.   private static final NumberFormat nf = new DecimalFormat("#0.###"); 
  20.   public RMB(double amount) { 
  21.     this.amount = amount; 
  22.   } 
  23.  
  24.   public String toBigAmt(){ 
  25.     return toBigAmt(this.amount); 
  26.   } 
  27.   public static String toBigAmt(double amount){ 
  28.     String amt = nf.format(amount); 
  29.     Double d = new Double(amount); 
  30.     String dotPart = ""//取小数位 
  31.     String intPart = ""//取整数位 
  32.     int dotPos; 
  33.  
  34.     if ( (dotPos = amt.indexOf('.')) != -1) { 
  35.       intPart = amt.substring(0, dotPos); 
  36.       dotPart = amt.substring(dotPos + 1); 
  37.     } 
  38.     else { 
  39.       intPart = amt; 
  40.     } 
  41.     if(intPart.length() > 16throw new java.lang.InternalError("The amount is too big."); 
  42.     String intBig = intToBig(intPart); 
  43.     String dotBig = dotToBig(dotPart); 
  44.     //以下代码稍做修改,现在是完美的代码啦! 
  45.     if ((dotBig.length() == 0)&&(intBig.length() != 0)) { 
  46.       return intBig + "元整"
  47.     }else if((dotBig.length() == 0)&&(intBig.length() == 0)){ 
  48.       return intBig + "零元";   
  49.     }else if((dotBig.length() != 0)&&(intBig.length() != 0)) { 
  50.       return intBig + "元" + dotBig; 
  51.     }else
  52.       return dotBig;   
  53.     } 
  54. /* 
  55.     if(dotBig.length() == 0) return intBig +"元整"; 
  56.     else return intBig + "元" + dotBig; 
  57. */ 
  58.   } 
  59.   private static String dotToBig(String dotPart){ 
  60.       //得到转换后的大写(小数部分) 
  61.     String strRet = ""
  62.     for(int i=0; i<dotPart.length() && i<3; i++){ 
  63.       int num; 
  64.       if((num = Integer.parseInt(dotPart.substring(i,i+1))) != 0
  65.         strRet += NUM.substring(num,num+1) + DOTUNIT.substring(i,i+1); 
  66.     } 
  67.     return strRet; 
  68.   } 
  69.  
  70.   private static String intToBig(String intPart){ 
  71.       //得到转换后的大写(整数部分) 
  72.       int grade; //级长 
  73.       String result = ""
  74.       String strTmp = ""
  75.  
  76.       //得到当级长 
  77.       grade = intPart.length() / GRADE; 
  78.       //调整级次长度 
  79.       if(intPart.length() % GRADE != 0) grade += 1
  80.  
  81.       //对每级数字处理 
  82.       for(int i = grade; i >= 1; i--){ 
  83.           strTmp = getNowGradeVal(intPart, i);//取得当前级次数字 
  84.           result += getSubUnit(strTmp);//转换大写 
  85.           result = dropZero(result);//除零 
  86.           //加级次单位 
  87.           if( i>1 ) //末位不加单位 
  88.               //单位不能相连续 
  89.               if(getSubUnit(strTmp).equals("零零零零")){ 
  90.                   result += "零"+GRADEUNIT.substring(i - 1, i); 
  91.               }else
  92.                   result += GRADEUNIT.substring(i - 1, i); 
  93.               } 
  94.  
  95.       } 
  96.       return result; 
  97.   } 
  98.   private static String getNowGradeVal(String strVal,int grade){ 
  99.       //得到当前级次的串 
  100.       String rst; 
  101.       if(strVal.length() <= grade * GRADE) 
  102.           rst = strVal.substring(0,strVal.length() - (grade-1)*GRADE); 
  103.       else 
  104.           rst = strVal.substring(strVal.length() - grade*GRADE,strVal.length() - (grade-1)*GRADE); 
  105.       return rst; 
  106.   } 
  107.  
  108.   private static String getSubUnit(String strVal){ 
  109.       //数值转换 
  110.       String rst = ""
  111.  
  112.       for(int i = 0;i< strVal.length(); i++){ 
  113.           String s = strVal.substring(i,i+1); 
  114.           int num = Integer.parseInt(s); 
  115.           if(num == 0){ 
  116.               //“零”作特殊处理 
  117.               if(i != strVal.length()) //转换后数末位不能为零 
  118.                   rst += "零"
  119.           }else
  120.               //If IntKey = 1 And i = 2 Then 
  121.                   //“壹拾”作特殊处理 
  122.                   //“壹拾”合理 
  123.               //Else 
  124.                   rst += NUM.substring(num,num+1); 
  125.               //End If 
  126.               //追加单位 
  127.               if(i != strVal.length()-1 )//个位不加单位 
  128.                 rst += UNIT.substring(i+4-strVal.length(),i+4-strVal.length()+1); 
  129.           } 
  130.       } 
  131.       return rst; 
  132.   } 
  133.   private static String dropZero(String strVal){ 
  134.       //去除连继的“零” 
  135.       String strRst; 
  136.       String strBefore; //前一位置字符 
  137.       String strNow;    //现在位置字符 
  138.  
  139.       strBefore = strVal.substring(0,1); 
  140.       strRst = strBefore; 
  141.  
  142.       for(int i= 1; i<strVal.length(); i++) { 
  143.           strNow = strVal.substring(i, i+1); 
  144.           if(strNow.equals("零") && strBefore.equals("零")) 
  145.               ;//同时为零 
  146.           else 
  147.               strRst += strNow; 
  148.           strBefore = strNow; 
  149.       } 
  150.  
  151.       //末位去零 
  152.       if(strRst.substring(strRst.length()-1, strRst.length()).equals("零")) 
  153.         strRst = strRst.substring(0,strRst.length()-1); 
  154.       return strRst; 
  155.   } 
  156.  
  157.   public static void main(String[] args) { 
  158.     System.out.println(RMB.toBigAmt(10052345.00D)); 
  159.     System.out.println(RMB.toBigAmt(0.00D)); 
  160.     System.out.println(RMB.toBigAmt(0.60D)); 
  161.     System.out.println(RMB.toBigAmt(00.60D)); 
  162.     System.out.println(RMB.toBigAmt(150.2101D)); 
  163.     System.out.println(RMB.toBigAmt(15400089666.234D)); 
  164.     System.out.println(RMB.toBigAmt(22200004444.2347D)); 
  165.  
  166.   } 
  167. }  

 

被阅1313次, 2投一票Java

丫头

2010-04-15 10:30:31
谢谢你啊
  • 看完了要说点啥么?
  • 昵称 (不填说不了话)
  • 信箱地址 (不会被公开,但是不填也说不了话)
  • 网址 (这个不填也成)
Powered by MiniBoke v2.0.0.8 Build 0828

Copyright © 2008 开源吧!. All rights reserved.

粤ICP备07500939号