转自:http://blog.csdn.net/u011943172/article/details/51554457
/**
* @author QSJ
* @describe 金额大写
* @date 2018-02-25
*/
public class AmountOfmoney {
/**
* 汉字大写
*/
private static String[] Amount = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
/**
* 货币单位
*/
private static String[] CountinUnit = {"分", "角", "元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "兆", "拾","佰", "仟"};
/**
* 特殊字符
*/
private static String[] SpecialCharacter = {"整","负"};
/**
* 精度
*/
private static final int Accuracy = 2;
public static void main(String [] args){
boolean exit = true;
do{
Scanner scan = new Scanner(System.in);
if(scan.hasNextBigDecimal()){
String money = Capital(scan.nextBigDecimal());
System.out.println("你输入的金额为:"+money);
}else{
System.out.println("请输入数字!");
exit = false;
}
}while(exit);
}
/**
* 输入的金额转换为大写
* @param count 金额
* @return
*/
public static String Capital(BigDecimal count){
StringBuffer sbf = new StringBuffer();
int whole = count.signum(); //返回-1,0,或1,此BigDecimal的值分类为负,零或正值。
if(whole==0){
return sbf.append(Amount[0]+CountinUnit[0]+SpecialCharacter[0]).toString();
}
//对金额进行四舍五入(向上取整)BigDecimal.ROUND_HALF_UP
long number = count.movePointRight(Accuracy).setScale(0,4).abs().longValue();
//获取金额的最后两位
long scale = number % 100;
long result;//解决精度损失问题(将一个long类型强转为int类型会存精度损失,导致数据不对)
int numUnit = 0; //数字下标
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(true){
if(number <= 0){
break;
}
//没次获取最后一个数
result = number % 10;
numUnit = (int) result; //存在精度的损失
if(numUnit > 0){
if((numIndex == 9) && (zeroSize >= 3)){
sbf.insert(0, CountinUnit[6]);
}
if((numIndex == 13) && (zeroSize >= 3)){
sbf.insert(0, CountinUnit[10]);
}
sbf.insert(0, CountinUnit[numIndex]);
sbf.insert(0, Amount[numUnit]);
getZero = false;
zeroSize = 0;
}else {
++zeroSize;
if(!(getZero)){
sbf.insert(0, Amount[numUnit]);
}
if(numIndex == 2){
if(number > 0){
sbf.insert(0, CountinUnit[numIndex]);
}
}else if(((numIndex - 2)%4 == 0) && (number % 1000 > 0)){
sbf.insert(0, CountinUnit[numIndex]);
}
getZero = true;
}
//让number每次都去掉最后一个数
number = number / 10;
++numIndex;
}
//如果whole == -1,则说明输入的数字为负数,就在最前面追加特殊字符:负
if(whole == -1){
sbf.insert(0, SpecialCharacter[1]);
}
//输入的数字小数点后两位为"00"的情况,则要在最后追加特殊字符:整
if(!(scale > 0)){
sbf.append(SpecialCharacter[0]);
}
return sbf.toString();
}
}