本工具类主要实现数字double1000.00====>>零万壹仟零佰零拾零元零角零分,注释很详细,就不多做介绍了
/**
* 不考虑分隔符的正确性
*/
private static final Pattern AMOUNT_PATTERN = Pattern.compile("^(0|[1-9]\\d{0,11})\\.(\\d\\d)$");
private static final char[] RMB_NUMS = "零壹贰叁肆伍陆柒捌玖".toCharArray();
private static final String[] UNITS = {"元", "角", "分"};
private static final String[] U1 = {"", "拾", "佰", "仟"};
private static final String[] U2 = {"", "万", "亿"};
/**
* 将金额(整数部分等于或少于12位,小数部分2位)转换为中文大写形式.
*
* @param money 金额数字
* @return 中文大写
*/
public static String convert(Double money) {
money = Math.abs(money);
if (Double.valueOf(0).equals(money)) {
return "零元";
}
String amount = moneyFormat(money);
// 去掉分隔符
amount = amount.replace(",", "");
// 验证金额正确性
Matcher matcher = AMOUNT_PATTERN.matcher(amount);
if (!matcher.find()) {
}
// 整数部分
String integer = matcher.group(1);
int i=Integer.valueOf(integer);
// 小数部分
String fraction = matcher.group(2);
String result = "";
result += integer2rmb(integer) + UNITS[0];
// 小数部分
result += fraction2rmb(fraction);
return result;
}
/**
* 将金额小数部分转换为中文大写
*/
private static String fraction2rmb(String fraction) {
// 角
char jiao = fraction.charAt(0);
// 分
char fen = fraction.charAt(1);
return (RMB_NUMS[jiao - '0'] + (jiao >= '0' ? UNITS[1] : "")) + (fen >= '0' ? RMB_NUMS[fen - '0'] + UNITS[2] : "");
}
/**
* 将金额整数部分转换为中文大写
*
* @param integer
* @return
*/
private static String integer2rmb(String integer) {
String integer1=integer;
StringBuilder buffer = new StringBuilder();
// 从个位数开始转换,因我所用收据单最多到万字段,所以最长长度为5
if (integer.length()<2&&integer.length()>0){
integer1="0"+"0"+"0"+"0"+integer;
}else if (integer.length()<3&&integer.length()>1){
integer1="0"+"0"+"0"+integer;
}else if (integer.length()<4&&integer.length()>2){
integer1="0"+"0"+integer;
}else if (integer.length()<5&&integer.length()>3){
integer1="0"+integer;
}
int i, j;
for (i =integer1.length()-1, j = 0; i >= 0; i--, j++) {
char n = integer1.charAt(i);
if (n==48){//此处是万位为0,执行下列操作
// 插入[万]或者[亿]
buffer.append(U2[j / 4]);
// 插入[拾]、[佰]或[仟]
buffer.append(U1[j % 4]);
}else {
// 插入[万]或者[亿]
buffer.append(U2[j / 4]);
// 插入[拾]、[佰]或[仟]
buffer.append(U1[j % 4]);
}
buffer.append(RMB_NUMS[n - '0']);
}
return buffer.reverse().toString();
}
/**
* 对金额的格式调整到分
*
* @param preMoney
* @return
*/
public static String moneyFormat(Double preMoney) {
//23->23.00
String money = preMoney.toString();
StringBuffer sb = new StringBuffer();
if (money == null) {
return "0.00";
}
int index = money.indexOf(".");
if (index == -1) {
return money + ".00";
} else {
//整数部分
String s0 = money.substring(0, index);
//小数部分
String s1 = money.substring(index + 1);
if (s1.length() == 1) {
//小数点后一位
s1 = s1 + "0";
} else if (s1.length() > 2) {
//如果超过3位小数,截取2位就可以了
s1 = s1.substring(0, 2);
}
sb.append(s0);
sb.append(".");
sb.append(s1);
}
return sb.toString();
}
下图是测试情况
结果:
该工具类借鉴了csdn用户君子志邦的【JAVA工具类】金额与汉字大小写的转换 金额转换,在其原有功能之上做出了部分调整,若有问题,请联系本人删除,谢谢理解
以下是原文出处: