package com.dsh.course.util;
|
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
|
public class ChineseMoneyUtils {
|
/**
|
* 中文数字
|
*/
|
final static private String[] CHINESE_NUMBER = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" };
|
/**
|
* 中文数字单位
|
*/
|
final static private String[] CHINESE_NUMBER_UNIT = { "", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟" };
|
/**
|
* 人民币单位
|
*/
|
final static private String[] CHINESE_MONEY_UNIT = { "圆", "角", "分" };
|
|
|
/**
|
* @param sourceMoney 要转换的数值,最多支持到亿
|
* @return 结果
|
*/
|
public static String toChineseMoney(BigDecimal sourceMoney) {
|
if (new BigDecimal("1000000000000").compareTo(sourceMoney) <= 0
|
&& BigDecimal.ZERO.compareTo(sourceMoney) >= 0) {
|
throw new RuntimeException("支持转换的金额范围为0~1万亿");
|
}
|
StringBuilder sb = new StringBuilder();
|
// 整数部分
|
BigDecimal intPart = sourceMoney.setScale(0, RoundingMode.DOWN);
|
// 小数部分
|
BigDecimal decimalPart = sourceMoney.subtract(intPart).multiply(new BigDecimal(100)).setScale(0,
|
RoundingMode.DOWN);
|
|
// 处理整数部分圆
|
if (intPart.compareTo(BigDecimal.ZERO) > 0) {
|
String intPartNumberString = intPart.toPlainString();
|
int length = intPartNumberString.length();
|
// 统计末尾的零,末尾零不做处理
|
int zeroCount = 0;
|
for (int i = length - 1; i >= 0; i--) {
|
int number = Integer.parseInt(String.valueOf(intPartNumberString.charAt(i)));
|
if (number == 0) {
|
zeroCount++;
|
} else {
|
break;
|
}
|
}
|
for (int i = 0; i < length; i++) {
|
// 如果转换到末尾0,则停止转换
|
if (i + zeroCount == length) {
|
break;
|
}
|
int number = Integer.parseInt(String.valueOf(intPartNumberString.charAt(i)));
|
// 获取中文数字
|
String chineseNumber = CHINESE_NUMBER[number];
|
// 获取中文数字单位
|
String chineseNumberUnit = CHINESE_NUMBER_UNIT[length - i - 1];
|
sb.append(chineseNumber).append(chineseNumberUnit);
|
}
|
// 统计完后加上金额单位
|
sb.append(CHINESE_MONEY_UNIT[0]);
|
} else {
|
sb.append(CHINESE_NUMBER[0]).append(CHINESE_MONEY_UNIT[0]);
|
}
|
|
// 处理小数部分
|
if (decimalPart.compareTo(new BigDecimal(10)) >= 0) {
|
// 角
|
String jiao = decimalPart.toPlainString();
|
int number = Integer.parseInt(String.valueOf(jiao.charAt(0)));
|
if (number != 0) {
|
String chineseNumber = CHINESE_NUMBER[number];
|
sb.append(chineseNumber).append(CHINESE_MONEY_UNIT[1]);
|
}
|
|
// 分
|
String fen = decimalPart.toPlainString();
|
number = Integer.parseInt(String.valueOf(fen.charAt(1)));
|
if (number != 0) {
|
String chineseNumber = CHINESE_NUMBER[number];
|
sb.append(chineseNumber).append(CHINESE_MONEY_UNIT[2]);
|
}
|
} else if (decimalPart.compareTo(BigDecimal.ZERO) > 0) {
|
// 分
|
String fen = decimalPart.toPlainString();
|
int number = Integer.parseInt(String.valueOf(fen.charAt(0)));
|
if (number != 0) {
|
String chineseNumber = CHINESE_NUMBER[number];
|
sb.append(chineseNumber).append(CHINESE_MONEY_UNIT[2]);
|
}
|
} else {
|
sb.append("整");
|
}
|
return sb.toString();
|
}
|
|
}
|