public static final String[][] CAPITAL;
static {
CAPITAL = new String[][] {
{ "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }, // 0-9
{ "拾", "佰", "仟" }, // 拾,佰,仟
{ "万" }, // 万
{ "亿" }, // 亿
{ "元" }, // 个位
{ "角", "分" }, // 小数位,{"角","分","厘"}
{ "正", "负" } // 正负数的前缀形式,当NEGATIVE=true时生效
};
}
/**
* 转换成大写金额
*
* @param strMoney(String):规范的数字货币形式字符串
*/
public static String toFrmString(String strMoney) {
StringBuffer sb = new StringBuffer(100);
String[] tmp = strMoney.trim().split("\\.");
// --------整数位处理---------------
char[] ci = tmp[0].toCharArray();
char theBit = '0'; // 当前数字位
int zeroBit = 0; // 开始零位
int bitLen = 0; // 当前位所处的位置(从个位开始0计数)
boolean flag = false; // 是否具有有效的整数位
for (int index = 0; index < ci.length; index++) {
theBit = ci[index]; // 取出当前处理的整数位
bitLen = ci.length - index - 1; // 计算当前处理的数处于什么位置
if (zeroBit > 0 && theBit != '0') {
sb.append(CAPITAL[0][0]); // 加前导零
}
if (theBit != '0')
sb.append(CAPITAL[0][theBit - '0']); // 大写数字
if (bitLen % 8 == 0) {
if (bitLen == 0) {
// 元
if (ci.length > 1 || theBit != '0')
sb.append(CAPITAL[4][0]); // 元
} else {
// 亿
sb.append(CAPITAL[3][0]); // 亿
}
} else {
if (bitLen % 4 == 0) {
// 万
if (theBit != '0' || zeroBit == 0 || zeroBit - bitLen < 3) {
sb.append(CAPITAL[2][0]); // 万
}
} else {
// 仟佰拾
if (theBit != '0')
sb.append(CAPITAL[1][bitLen % 4 - 1]); // 仟佰拾
}
}
// 检查并条件更新零位
if (theBit == '0') {
zeroBit = zeroBit == 0 ? bitLen : zeroBit;
} else {
zeroBit = 0;
flag = true;
}
}
// --------小数位处理---------------
char[] cf = null;
String zs = "";
if (tmp.length > 1) {
cf = tmp[1].toCharArray();
for (int index = 0; index < cf.length; index++) {
theBit = cf[index]; // 取出当前处理的小数位
if (zeroBit > 0 && theBit != '0' && flag) {
sb.append(CAPITAL[0][0]); // 加前导零
}
if (theBit != '0')
sb.append(CAPITAL[0][theBit - '0']); // 大写数字
if (theBit != '0')
sb.append(CAPITAL[5][index]); // 角分
zeroBit = theBit == '0' ? 1 : 0;
}
}else{
zs = "整";
}
String ret = null;
ret = (sb.length() == 0 ? (CAPITAL[0][0] + CAPITAL[4][0]) : sb
.toString());
ret = ret.concat(zs);
return ret;
}
/**
* 货币数字形式转换成大写
*
* @param strMoney(String):货币的数字形式字符串
*/
public static String parseMoney(String strMoney)
throws NumberFormatException {
BigDecimal bd = new BigDecimal(strMoney);
// 输入检查
if (bd.signum() == -1 && !NEGATIVE)
throw new NumberFormatException(" 货币金额不能为负数 ");
try {
bd.setScale(CAPITAL[5].length);
} catch (ArithmeticException e) {
throw new NumberFormatException(" 只能为 " + CAPITAL[5].length
+ " 位小数 ");
}
// 大写金额转换
if (NEGATIVE && bd.signum() != 0) {
return CAPITAL[6][bd.signum() == -1 ? 1 : 0]
+ toFrmString(bd.abs().toString());
} else {
return toFrmString(bd.toString());
}
}