import java.math.BigDecimal;
/**
* <h1>金额大写</h1>
*/
public class CapitalAmount {
/**
* 汉字大写
*/
private static final String[] AMOUNT = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
/**
* 货币单位
*/
private static final String[] UNIT = {"分", "角", "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "兆", "拾","佰", "仟"};
/**
* 特殊字符
*/
private static final String[] SPEC = {"整","负"};
/**
* 精度
*/
private static final int ACCURACY = 2;
/**
* 输入的金额转换为大写
* @param amount 金额
* @return 大写后的金额
*/
public static String capital(BigDecimal amount){
StringBuilder sbf = new StringBuilder();
// 返回-1,0,或1,此BigDecimal的值分类为负,零或正值。
int whole = amount.signum();
if(whole == 0){
// 输入0时返回 零元整
return sbf.append(AMOUNT[0]).append(UNIT[2]).append(SPEC[0]).toString();
}
// 对金额进行四舍五入(向上取整)BigDecimal.ROUND_HALF_UP
long number = amount.movePointRight(ACCURACY).setScale(0,4).abs().longValue();
// 获取金额的最后两位
long scale = number % 100;
// 解决精度损失问题(将一个long类型强转为int类型会存精度损失,导致数据不对)
long result;
// 数字下标
int numUnit;
// 单位下标
int numIndex = 0;
// 获取零
boolean getZero = false;
// 判断最后两位数: 分为四种情况: 00=0, 01=1, 10,11
if(scale <= 0){
numIndex = 2;
number = number/100;
getZero = true;
}
if((scale > 0) && ((scale % 10 <= 0))){
numIndex = 1;
number = number / 10;
getZero = true;
}
int zeroSize = 0;
while(number>0){
// 每次获取最后一个数
result = number % 10;
// 存在精度的损失
numUnit = (int) result;
if(numUnit > 0){
if((numIndex == 9) && (zeroSize >= 3)){
// 万
sbf.insert(0, UNIT[6]);
}
if((numIndex == 13) && (zeroSize >= 3)){
// 亿
sbf.insert(0, UNIT[10]);
}
sbf.insert(0, UNIT[numIndex]);
sbf.insert(0, AMOUNT[numUnit]);
getZero = false;
zeroSize = 0;
}else {
++zeroSize;
if(!(getZero)){
sbf.insert(0, AMOUNT[numUnit]);
}
if(numIndex == 2){
sbf.insert(0, UNIT[numIndex]);
}else if(((numIndex - 2)%4 == 0) && (number % 1000 > 0)){
sbf.insert(0, UNIT[numIndex]);
}
getZero = true;
}
// 让number每次都去掉最后一个数
number = number / 10;
++numIndex;
}
// 如果whole == -1,则说明输入的数字为负数,就在最前面追加特殊字符:负
if(whole == -1){
sbf.insert(0, SPEC[1]);
}
// 输入的数字小数点后两位为"00"的情况,则要在最后追加特殊字符:整
if(scale <= 0){
sbf.append(SPEC[0]);
}
return sbf.toString();
}
}
copy