import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
 * 
 * TODO:人民币小写转换为大写类
 * <br>
 * <b>Company</b>:
 *              * <br>
 * <b>Writer</b>: 
 *            * <b>CreateTime<b>:
 *             */
public class SimpleMoneyFormat {
static boolean ISIGNORE = false;// 参数用来设置是否忽略错误,true为忽略错误,默认为false static List digits = new ArrayList(); static List setDigits = new ArrayList();
static {
digits.add("拾");// 0:拾
digits.add("佰");// 1:佰
digits.add("仟");// 2:仟
digits.add("萬");// ,3:萬
digits.add("拾");// 4:拾萬
digits.add("佰");// ,5:佰萬
digits.add("仟");// 6:仟萬
digits.add("亿");// ,7:亿
digits.add("拾");// 8:拾亿
digits.add("佰");// ,9:佰亿
digits.add("仟");// 10:仟亿
digits.add("兆");// 11:兆
digits.add("拾");// 12:拾兆
digits.add("佰");// ,13:佰兆
digits.add("仟");// 仟兆
// digits.add("京"); //.
// digits.add("拾");//12:拾京
// digits.add("佰");//,13:佰京
// digits.add("仟");//???
// .....
setDigits.add("萬");
setDigits.add("亿");
setDigits.add("兆");
// setDigits.add("京"); //
// .....
// 百度搜索:个、十、百、千、万、十万、百万、千万、亿、兆(10的12次方)、京〔10的16次方)、垓、秭、穰、沟、涧、正、载、极(10的48次方)、恒河沙、阿僧示氏、(梵文译音、意思是无量)、那由他、不可思议(10的64次方)、无量数(∞)。
} public String run(double moneyDb) throws Exception {
java.text.DecimalFormat fmt = new java.text.DecimalFormat(".00");
String moneyStr = fmt.format(moneyDb);
if (moneyDb == 0) {
return "零圆整";
}
return ConvertData(moneyStr);
} // 转换RMB函数
String ConvertData(String moneyParam) throws Exception {
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("负");
len--;
}
strMoneys[0] = strMoneys[0].replaceFirst("-", "");
// 判断可不可以转
if (len > digits.size() + 1) {
if (this.ISIGNORE) {
return moneyParam;
}
throw new Exception("函数: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(".*零零.*");// ("零零|零萬|零亿");
java.util.regex.Matcher m = p.matcher(tmp);
while (m.find()) {
tmp = tmp.replaceAll("零零", "零");
m = p.matcher(tmp);
}
// lindigits
String preDigitsName = "", digitsName;
for (int i = 0; i < setDigits.size(); i++) {
digitsName = (String) setDigits.get(i);
tmp = tmp.replaceAll("零" + 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 + "零");
tmp = tmp.replaceAll("零零", "零");
// System.out.println("===138");
}
}
preDigitsName = digitsName;
// java.util.regex.Pattern.matches(regex, input)
}
// end of lin
if (tmp.endsWith("零")) {
tmp = tmp.substring(0, tmp.length() - 1);
}
tmp = tmp.concat("圆");
if (tmp.startsWith("圆")) {
tmp = tmp.substring(1);
}
// 转小数
if (strMoneys[1].equals("00")) {
return tmp.concat("整");
} else {
String rstr = "";
String tmpstr = strMoneys[1].substring(0, 1);
String ret = Convert1Digit(tmpstr, -2);
if (ret != "零" && !(ret.equals("零"))) {
rstr = ret.concat("角");
} else if (tmp != "") {
rstr = "零";
}
tmpstr = strMoneys[1].substring(1, 2);
rstr = rstr.concat(Convert1Digit(tmpstr, -2) + "分");
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("零");
}
return reStr.toString();
}
// digit = -1 为个位
switch (num) {// 取值名称,
case 0:
reStr.append("零");
break;
case 1:
reStr.append("壹");
break;
case 2:
reStr.append("贰");
break;
case 3:
reStr.append("叁");
break;
case 4:
reStr.append("肆");
break;
case 5:
reStr.append("伍");
break;
case 6:
reStr.append("陆");
break;
case 7:
reStr.append("柒");
break;
case 8:
reStr.append("捌");
break;
case 9:
reStr.append("玖");
break;
} // -1为个位-2为小数,
if (digit >= 0) {// 取位名称
reStr.append(digits.get(digit));
}
return reStr.toString();
} // test===
public static void main(String[] args) throws Exception {
Rmb rmb = new Rmb();
System.out.println(rmb.run(-45050000000122.2155));
System.out.println(rmb.run(5000122.2155));
}
//字符串反转
public static String convertStr(String str) {
int i;
String temp = "";
if (str != "") {
for (i = str.length() - 1; i >= 0; i--) {
temp = temp + str.charAt(i);
}
}
return temp;
}
}