java
import java.text.DecimalFormat; import java.text.NumberFormat; public class MoneyUtil { //总体思路: //对数字进行分级处理,级长为4 //对分级后的每级分别处理,处理后得到字符串相连 //如:123456=12|3456 //第二级:12=壹拾贰 + “万” //第一级:3456 =叁千肆百伍拾陆 + “” private double amount = 0.0D; private static final String NUM = "零壹贰叁肆伍陆柒捌玖"; private static final String UNIT = "仟佰拾个"; private static final String GRADEUNIT = "仟万亿兆"; private static final String DOTUNIT = "角分厘"; private static final int GRADE = 4; private static final String SIGN = "¥"; private static final NumberFormat nf = new DecimalFormat("#0.###"); public static String toBig(String str){ String ret=""; for (int i=0;i<str.length();i++){ String temp=str.substring(i, i+1); int n=Integer.parseInt(temp); ret+=NUM.substring(n, n+1); } return ret; } public MoneyUtil(double amount) { this.amount = amount; } public String toBigAmt(){ return toBigAmt(this.amount); } public static String toBigAmt(double amount){ String amt = nf.format(amount); Double d = new Double(amount); 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; } /* if(dotBig.length() == 0) return intBig +"元整"; else return intBig + "元" + dotBig; */ } private static 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; } public static 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(intPart, i);//取得当前级次数字 result += getSubUnit(strTmp);//转换大写 result = dropZero(result);//除零 //加级次单位 if( i>1 ) //末位不加单位 //单位不能相连续 if(getSubUnit(strTmp).equals("零零零零")){ result += "零"+GRADEUNIT.substring(i - 1, i); }else{ result += GRADEUNIT.substring(i - 1, i); } } return result; } private static String getNowGradeVal(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; } private static 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{ //If IntKey = 1 And i = 2 Then //“壹拾”作特殊处理 //“壹拾”合理 //Else rst += NUM.substring(num,num+1); //End If //追加单位 if(i != strVal.length()-1 )//个位不加单位 rst += UNIT.substring(i+4-strVal.length(),i+4-strVal.length()+1); } } return rst; } private static 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; } public static void main(String[] args){ System.out.println(MoneyUtil.toBigAmt(1000000)); System.out.println(MoneyUtil.toBigAmt(0.00D)); System.out.println(MoneyUtil.toBigAmt(0.60D)); System.out.println(MoneyUtil.toBigAmt(00.60D)); System.out.println(MoneyUtil.toBigAmt(150.2101D)); System.out.println(MoneyUtil.toBigAmt(15400089666.234D)); System.out.println(MoneyUtil.toBigAmt(22200004444.2347D)); } }console
壹佰万元 零元 陆角 陆角 壹佰伍拾元贰角壹分 壹佰伍拾肆亿零捌万玖仟陆佰陆拾陆元贰角叁分肆厘 贰佰贰拾贰亿零万肆仟肆佰肆拾肆元贰角叁分伍厘