package com.dsh.guns.modular.system.util;
|
|
import java.math.BigDecimal;
|
|
public class BigDecimalToChineseAmountUtil {
|
private static final String[] CN_UPPER_NUMBER = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
|
private static final String[] CN_UPPER_MONETRAY_UNIT = {"分", "角", "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "兆", "拾", "佰", "仟"};
|
private static final String CN_FULL = "整";
|
private static final String CN_NEGATIVE = "负";
|
private static final int MONEY_PRECISION = 2;
|
|
public static String convertToChineseAmount(BigDecimal number) {
|
StringBuilder builder = new StringBuilder();
|
|
if (number.compareTo(BigDecimal.ZERO) < 0) {
|
builder.append(CN_NEGATIVE);
|
number = number.abs();
|
}
|
|
long integralPart = number.longValue();
|
BigDecimal decimalPart = number.subtract(BigDecimal.valueOf(integralPart)).multiply(BigDecimal.TEN.pow(MONEY_PRECISION));
|
|
if (decimalPart.compareTo(BigDecimal.ZERO) == 0) {
|
builder.append(CN_FULL);
|
}
|
|
long integralPartTemp = integralPart;
|
int unit = 0;
|
boolean isZero = true;
|
boolean needZero = false;
|
|
while (integralPartTemp > 0) {
|
long tempNumber = integralPartTemp % 10;
|
if (tempNumber > 0) {
|
if (needZero) {
|
builder.insert(0, CN_UPPER_NUMBER[0]);
|
}
|
builder.insert(0, CN_UPPER_MONETRAY_UNIT[unit]);
|
builder.insert(0, CN_UPPER_NUMBER[(int) tempNumber]);
|
isZero = false;
|
needZero = false;
|
} else {
|
if (!isZero) {
|
needZero = true;
|
}
|
if (unit == 2 || unit == 6 || unit == 10 || unit == 14) {
|
builder.insert(0, CN_UPPER_MONETRAY_UNIT[unit]);
|
isZero = true;
|
}
|
}
|
integralPartTemp = integralPartTemp / 10;
|
unit++;
|
}
|
|
if (decimalPart.compareTo(BigDecimal.ZERO) > 0) {
|
builder.append(convertDecimalToChinese(decimalPart));
|
}
|
|
return builder.toString();
|
}
|
|
private static String convertDecimalToChinese(BigDecimal decimalPart) {
|
StringBuilder builder = new StringBuilder();
|
|
for (int i = 0; i < MONEY_PRECISION; i++) {
|
int num = decimalPart.intValue() % 10;
|
builder.insert(0, CN_UPPER_NUMBER[num]);
|
builder.append(CN_UPPER_MONETRAY_UNIT[i + 2]);
|
decimalPart = decimalPart.multiply(BigDecimal.TEN);
|
}
|
|
return builder.toString();
|
}
|
|
public static void main(String[] args) {
|
BigDecimal number = new BigDecimal("12345.67");
|
String chineseAmount = convertToChineseAmount(number);
|
System.out.println(chineseAmount); // Output: 壹万贰仟叁佰肆拾伍元陆角柒分
|
}
|
}
|