Java实现数字大写

转自: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();
	}
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值