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. public final class RMB {
  10.   private double amount = 0.0D;
  11.   private static final String NUM = "零壹贰叁肆伍陆柒捌玖";
  12.   private static final String UNIT = "仟佰拾个";
  13.   private static final String GRADEUNIT = "仟万亿兆";
  14.   private static final String DOTUNIT = "角分厘";
  15.   private static final int GRADE = 4;
  16.   private static final String SIGN = "¥";
  17.   private static final 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.   public static 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() > 16throw new 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.     }else if((dotBig.length() == 0)&&(intBig.length() == 0)){
  44.       return intBig + "零元";  
  45.     }else if((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.   private static 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.   private static 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.   private static 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.   private static 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.   private static 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.   public static void 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.   }
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值