Java金额大写转换

来源:互联网 发布:怎么删除淘宝上的好评 编辑:程序博客网 时间:2024/05/05 06:33
package Rong;
import java.text.DecimalFormat;
import java.text.NumberFormat;
//总体思路:
//对数字进行分级处理,级长为4
//对分级后的每级分别处理,处理后得到字符串相连
//如:123456=12|3456
//第二级:12=壹拾贰 + “万”
//第一级:3456 =叁千肆百伍拾陆 + “”
public final class change{
    privatestatic final String NUM = "零壹贰叁肆伍陆柒捌玖";
    privatestatic final String UNIT = "仟佰拾个";
    privatestatic final String GRADEUNIT = "仟万亿兆";
    privatestatic final String DOTUNIT = "角分厘";
    privatestatic final int GRADE = 4;
    privatestatic final NumberFormat nf = new DecimalFormat("#0.###");

    publicstatic String toBigAmt(double amount) {
       nf.setMinimumFractionDigits(3);//小数点后不足的补零
       String amt =nf.format(amount);//将double类型的数格式化并转换成字符串,实际上进行了四舍五入
       System.out.println(amt);
       String dotPart = ""; //取小数位
       String intPart = ""; //取整数位
       int dotPos;

       if ((dotPos = amt.indexOf('.')) != -1) {
           intPart = amt.substring(0, dotPos);
           dotPart = amt.substring(dotPos + 1);
       } else {
           intPart = amt;
       }
       if (intPart.length() > 16)
           throw new java.lang.InternalError("The amount is too big.");
       String intBig = intToBig(intPart);
       String dotBig = dotToBig(dotPart);
       //以下代码稍做修改,现在是完美的代码啦!
       if ((dotBig.length() == 0) &&(intBig.length() != 0)) {
           return intBig + "元整";
       } else if ((dotBig.length() == 0)&& (intBig.length() == 0)) {
           return intBig + "零元";
       } else if ((dotBig.length() != 0)&& (intBig.length() != 0)) {
           return intBig + "元" + dotBig;
       } else {
           return dotBig;
       }
    }
   //用来处理几角几分几厘
    privatestatic String dotToBig(String dotPart) {
       //得到转换后的大写(小数部分)
       String strRet = "";
       for (int i = 0; i < dotPart.length()&& i < 3; i++){
           int num;
           if ((num = Integer.parseInt(dotPart.substring(i, i + 1))) !=0)
               strRet += NUM.substring(num, num + 1)
                       + DOTUNIT.substring(i, i + 1);
       }
       return strRet;
    }
   //用来处理多少元
    privatestatic String intToBig(String intPart) {
       //得到转换后的大写(整数部分)
       int grade; //级长
       String result = "";
       String strTmp = "";
       //得到当级长
       grade = intPart.length() / GRADE;
       //调整级次长度
       if (intPart.length() % GRADE != 0)
           grade += 1;
       //对每级数字处理,先处理最高级,然后再处理低级的
       for (int i = grade; i >= 1; i--) {
           strTmp = getNowGradeval_r(intPart, i);//取得当前级次数字
           result += getSubUnit(strTmp);//转换大写
           result = dropZero(result);//除零 去掉连续的零
           //加级次单位
           if (i > 1) //末位不加单位
               //单位不能相连续
               //注意:连续4个零的时候要特殊处理
               if(getSubUnit(strTmp).equals("零零零零")){
                   result = result+"零";
               }else{
                result += GRADEUNIT.substring(i - 1, i);
               }
       }
       return result;
    }
   //得到当前级次的串
    privatestatic String getNowGradeval_r(String strVal, int grade){     
       String rst;
       if (strVal.length() <= grade * GRADE)
           rst = strVal.substring(0, strVal.length() - (grade - 1) *GRADE);
       else
           rst = strVal.substring(strVal.length() - grade * GRADE,strVal
                   .length()
                   - (grade - 1) * GRADE);
       return rst;
    }
    //数值转换
    privatestatic String getSubUnit(String strVal){     
       String rst = "";
       for (int i = 0; i < strVal.length(); i++) {
           String s = strVal.substring(i, i + 1);
           int num = Integer.parseInt(s);
           if (num == 0) {
               //“零”作特殊处理
               if (i != strVal.length()) //转换后数末位不能为零
                   rst += "零";
           }
           else {
               //“壹拾”作特殊处理
               rst += NUM.substring(num, num + 1);
               //追加单位
               if (i != strVal.length() - 1)//个位不加单位
                   rst += UNIT.substring(i + 4 - strVal.length(), i + 4
                           - strVal.length() + 1);
           }
       }
       return rst;
    }
   //去除连继的“零”
    privatestatic String dropZero(String strVal){    
       String strRst;
       String strBefore; //前一位置字符
       String strNow; //现在位置字符
       strBefore = strVal.substring(0, 1);
       strRst = strBefore;
       for (int i = 1; i < strVal.length(); i++) {
           strNow = strVal.substring(i, i + 1);
           if (strNow.equals("零") &&strBefore.equals("零"))
            ;//同时为零
           else
               strRst += strNow;
           strBefore = strNow;
       }
       //末位去零
       if (strRst.substring(strRst.length() - 1,strRst.length()).equals("零"))
           strRst = strRst.substring(0, strRst.length() - 1);
       return strRst;
    }
    publicstatic void main(String[] args){     
    System.out.println(change.toBigAmt(0.090D));  

    }
}
原创粉丝点击