1. 程式人生 > >Java實現數字大寫

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