java 转化金额成人民币大写通用方法工具类
package cn.classd.util;
/**
* programmed by HuangHeliang 2009.04.15 10:20:51
*/
public final class ChangeRMB {
// 每个数字对应的大写
private static final String[] num = { "零", "壹", "贰", "叁", "肆", "伍", "陆",
"柒", "捌", "玖", };
// 从低到高排列的单位
private static final String[] bit = { "圆", "拾", "佰", "仟", "万", "拾", "佰",
"仟", "亿", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿" };
// 金额里面的角和分
private static final String[] jf = { "角", "分" };
/**
* 处理金额的整数部分,返回"...圆整"
*
* @param integer
* @return String
* @throws Exception
*/
public static String praseUpcaseRMB(String integer) throws Exception {
StringBuilder sbdr = new StringBuilder("");
int j = integer.length();
if (j > bit.length)
throw new Exception("\n只能处理亿万亿以内的数据(含亿万亿)!");
char[] rmb = integer.toCharArray();
for (int i = 0; i < rmb.length; i++) {
int numLocate = Integer.parseInt("" + rmb[i]); // 大写数字位置
int bitLocate = j - 1 - i; // 数字单位的位置
/*
* 连续大写零只添加一个
*/
if (numLocate == 0) {
if (!sbdr.toString().endsWith(num[0])) {
sbdr.append(num[numLocate]);
}
continue;
}
/*
* 下面的if语句保证 10065004583.05-->壹佰亿陆仟伍佰万肆仟伍佰捌拾叁圆零伍分
*/
if (bit[bitLocate].equals("仟")) {
String s = sbdr.toString();
if (!s.endsWith(bit[bitLocate + 1]) && s.length() > 0) {
if (s.endsWith(num[0])) {
sbdr.deleteCharAt(sbdr.length() - 1);
}
sbdr.append(bit[bitLocate + 1]);
}
}
sbdr.append(num[numLocate]);
sbdr.append(bit[bitLocate]);
}// end for
/*
* 去掉结尾"零"后,补全
*/
if (sbdr.toString().endsWith(num[0])) {
sbdr.deleteCharAt(sbdr.length() - 1);
sbdr.append("圆整");
} else {
sbdr.append("整");
}
return sbdr.toString();
}
/**
* 处理带小数的金额,整数部分交由上一个方法处理,小数部分自己处理
*
* @param integer
* @param decimal
* @return String
* @throws Exception
*/
public static String praseUpcaseRMB(String integer, String decimal)
throws Exception {
String ret = ChangeRMB.praseUpcaseRMB(integer);
ret = ret.split("整")[0]; // 处理整数部分
StringBuilder sbdr = new StringBuilder("");
sbdr.append(ret);
char[] rmbjf = decimal.toCharArray();
for (int i = 0; i < rmbjf.length; i++) {
int locate = Integer.parseInt("" + rmbjf[i]);
if (locate == 0) {
if (!sbdr.toString().endsWith(num[0])) {
sbdr.append(num[locate]);
}
continue;
}
sbdr.append(num[locate]);
sbdr.append(jf[i]);
}
return sbdr.toString();
}
/**
* 将double形式的字符串(有两位小数或无小数)转换成人民币的大写格式
*
* @param doubleStr
* @return String
* @throws Exception
*/
public static String doChangeRMB(String doubleStr) throws Exception {
String result = null;
if (doubleStr.contains(".")) { // 金额带小数
int dotloc = doubleStr.indexOf(".");
int strlen = doubleStr.length();
String integer = doubleStr.substring(0, dotloc);
String decimal = doubleStr.substring(dotloc + 1, strlen);
result = ChangeRMB.praseUpcaseRMB(integer, decimal);
} else { // 金额是整数
String integer = doubleStr;
result = ChangeRMB.praseUpcaseRMB(integer);
}
return result;
}
/**
* 将double数值(有两位小数或无小数)转换成人民币的大写格式
*
* @param rmbDouble
* @return String
* @throws Exception
*/
public static String doChangeRMB(double rmbDouble) throws Exception {
String result = null;
double theInt = Math.rint(rmbDouble);
if (theInt > rmbDouble) {
theInt -= 1;
}
double theDecimal = rmbDouble - theInt;
String integer = new Long((long) theInt).toString();
String decimal = "" + Math.round(theDecimal * 100);
if (decimal.equals("0")) {
result = ChangeRMB.praseUpcaseRMB(integer);
} else {
result = ChangeRMB.praseUpcaseRMB(integer, decimal);
}
// 小数是零结尾的
if (result.charAt(result.length() - 1) == '零') {
result = result.substring(0, result.length() - 1);
}
return result;
}
/*
* test public static void main(String[] args) throws Exception{
* System.out.print("输入小写人民币金额:"); BufferedReader br = new
* BufferedReader(new InputStreamReader(System.in)); String in =
* br.readLine();
*
* String result=ChangeRMB.doChangeRMB(in);
*
* System.out.println("\n"+"------------转换结果------------");
* System.out.println(result);
*
* double d=54628569856.68; String ret=ChangeRMB.doChangeRMB(d);
* System.out.println("\n"+"------------转换结果------------");
* System.out.println(ret); }
*/
}