Java實現數字大寫
阿新 • • 發佈:2018-12-28
轉自: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(); } }