package com.camelsys.balance.util; import java.util.ArrayList; import java.util.List; import com.camelsys.platform.base.BaseException; import com.camelsys.platform.util.Utility; public class MoneyConvert { static boolean ISIGNORE = false;//参数用来设置是否忽略错误,true为忽略错误,默认为false static List digits = new ArrayList(); static List setDigits = new ArrayList(); static { digits.add(Utility.getMessage("money.unit.shi"));//0:拾 //"拾" digits.add(Utility.getMessage("money.unit.bai"));//1:佰 //"佰" digits.add(Utility.getMessage("money.unit.qian"));//2:仟 //"仟" digits.add(Utility.getMessage("money.unit.wan"));//,3:萬 //"萬" digits.add(Utility.getMessage("money.unit.shi"));//4:拾萬 //"拾" digits.add(Utility.getMessage("money.unit.bai"));//,5:佰萬 //"佰" digits.add(Utility.getMessage("money.unit.qian"));//6:仟萬 //"仟" digits.add(Utility.getMessage("money.unit.yi"));//,7:亿 //"亿" digits.add(Utility.getMessage("money.unit.shi"));//8:拾亿 //"拾" digits.add(Utility.getMessage("money.unit.bai"));//,9:佰亿 //"佰" digits.add(Utility.getMessage("money.unit.qian"));//10:仟亿 //"仟" digits.add(Utility.getMessage("money.unit.zhao"));//11:兆 //"兆" digits.add(Utility.getMessage("money.unit.shi"));//12:拾兆 //"拾" digits.add(Utility.getMessage("money.unit.bai"));//,13:佰兆 //"佰" digits.add(Utility.getMessage("money.unit.qian"));//仟兆 //"仟" // digits.add("京"); //. // digits.add("拾");//12:拾京 // digits.add("佰");//,13:佰京 // digits.add("仟");//??? //..... setDigits.add(Utility.getMessage("money.unit.wan")); //"萬" setDigits.add(Utility.getMessage("money.unit.yi")); //"亿" setDigits.add(Utility.getMessage("money.unit.zhao")); //"兆" // setDigits.add("京"); // //..... //百度搜索:个、十、百、千、万、十万、百万、千万、亿、兆(10的12次方)、京〔10的16次方)、垓、秭、穰、沟、涧、正、载、极(10的48次方)、恒河沙、阿僧示氏、(梵文译音、意思是无量)、那由他、不可思议(10的64次方)、无量数(∞)。 } public String run(double moneyDb) throws BaseException { java.text.DecimalFormat fmt = new java.text.DecimalFormat(".00"); String moneyStr = fmt.format(moneyDb); if(moneyDb == 0) { return Utility.getMessage("money.zero.zheng");//"零圆整" } return ConvertData(moneyStr); } // 转换RMB函数 String ConvertData(String moneyParam) throws BaseException { System.out.println("=====try to fmt:"+moneyParam); StringBuffer returnValue = new StringBuffer(); String [] strMoneys = java.util.regex.Pattern.compile("//.").split(moneyParam); int len = strMoneys[0].length(); if(strMoneys[0].startsWith("-")) { returnValue.append(Utility.getMessage("money.negative"));//"负" len--; } strMoneys[0] = strMoneys[0].replaceFirst("-", ""); // 判断可不可以转 if(len>digits.size()+1) { if(this.ISIGNORE) { return moneyParam; } throw new BaseException("error.parseMoney.error");//函数:RMB出错:数字太大或太小,无法换算. } //转整数 for(int i = 0; i < strMoneys[0].length(); i++) { String value = strMoneys[0].charAt(i)+""; returnValue.append(Convert1Digit(value,strMoneys[0].length()-2-i)); } String tmp = returnValue.toString(); //linlin.. java.util.regex.Pattern p = java.util.regex.Pattern.compile(".*"+Utility.getMessage("number.zero")+Utility.getMessage("number.zero")+".*");//("零零|零萬|零亿"); //零零 java.util.regex.Matcher m = p.matcher(tmp); while(m.find()) { tmp = tmp.replaceAll(Utility.getMessage("number.zero")+Utility.getMessage("number.zero"), Utility.getMessage("number.zero"));// "零零","零" m = p.matcher(tmp); } //lindigits String preDigitsName="",digitsName; for(int i = 0; i < setDigits.size(); i++) { digitsName = (String)setDigits.get(i); tmp = tmp.replaceAll(Utility.getMessage("number.zero")+digitsName,digitsName);//"零" } if(!setDigits.isEmpty()) { preDigitsName = (String) setDigits.get(0); } for(int i = 1; i < setDigits.size(); i++) {//tmp = tmp.replaceAll("亿萬","亿零"); digitsName = (String) setDigits.get(i); if(tmp.matches(".*"+digitsName.concat(preDigitsName)+".*")) { tmp = tmp.replaceAll(digitsName.concat(preDigitsName), digitsName); if(digitsName != "" && !(digitsName.equals(""))) { tmp = tmp.replaceAll(digitsName, digitsName+Utility.getMessage("number.zero"));//"零" tmp = tmp.replaceAll(Utility.getMessage("number.zero")+Utility.getMessage("number.zero"), Utility.getMessage("number.zero")); // "零零", "零" //System.out.println("===138"); } } preDigitsName = digitsName; //java.util.regex.Pattern.matches(regex, input) } //end of lin if(tmp.endsWith(Utility.getMessage("number.zero"))) {//"零" tmp = tmp.substring(0,tmp.length()-1); } tmp = tmp.concat(Utility.getMessage("money.unit.yuan"));//"圆" if(tmp.startsWith(Utility.getMessage("money.unit.yuan"))) {//"圆" tmp = tmp.substring(1); } //转小数 if(strMoneys[1].equals("00")) { return tmp.concat(Utility.getMessage("money.unit.zheng"));//"整" } else { String rstr = ""; String tmpstr = strMoneys[1].substring(0, 1); String ret = Convert1Digit(tmpstr,-2); if(ret != Utility.getMessage("number.zero") && !(ret.equals(Utility.getMessage("number.zero")))) {//"零" "零" rstr = ret.concat(Utility.getMessage("money.unit.jiao"));//"角" } else if(tmp != "") { rstr = Utility.getMessage("number.zero");//"零" } tmpstr = strMoneys[1].substring(1, 2); rstr = rstr.concat(Convert1Digit(tmpstr,-2) + Utility.getMessage("money.unit.fen"));//"分" return tmp.concat(rstr); } } // digit为-1时是个位-2是小数位不加位名称直接返回大写数 private String Convert1Digit(String str,int digit) { StringBuffer reStr = new StringBuffer(""); //System.out.println ("length:"+reStr.length()); int num = java.lang.Integer.parseInt(str); if(digit != -2 && num == 0) {//整数对零的处理 if(digit >= 0 && setDigits.contains(digits.get(digit))) {//万位和亿位是零要念一个万或亿 reStr.append(digits.get(digit)); } else { reStr.append(Utility.getMessage("number.zero"));//"零" } return reStr.toString(); } // digit = -1 为个位 switch(num) {//取值名称, case 0: reStr.append(Utility.getMessage("number.zero")); break;//零 case 1: reStr.append(Utility.getMessage("number.one")); break;//壹 case 2: reStr.append(Utility.getMessage("number.two")); break;//贰 case 3: reStr.append(Utility.getMessage("number.three")); break;//叁 case 4: reStr.append(Utility.getMessage("number.four")); break;//肆 case 5: reStr.append(Utility.getMessage("number.five")); break;//伍 case 6: reStr.append(Utility.getMessage("number.six")); break;//陆 case 7: reStr.append(Utility.getMessage("number.seven")); break;//柒 case 8: reStr.append(Utility.getMessage("number.eight")); break;//捌 case 9: reStr.append(Utility.getMessage("number.nine")); break;//玖 } // -1为个位-2为小数, if(digit >= 0 ) {//取位名称 reStr.append(digits.get(digit)); } return reStr.toString(); } //test=== public static void main(String[] args) throws Exception { MoneyConvert rmb = new MoneyConvert(); System.out.println(rmb.run(-45050000000122.2155)); } }