1. 程式人生 > >java數字轉漢字大寫(全)

java數字轉漢字大寫(全)

  1. public class MoneyUtil {  
  2.     public static String[] chineseDigits = new String[] { "零", "壹", "貳", "叄", "肆", "伍", "陸", "柒", "捌", "玖"};  
  3.     /** 
  4.      * 把金額轉換為漢字表示的數量,小數點後四捨五入保留兩位 
  5.      * @param amount 
  6.      * @return 
  7.      */  
  8.     public static String amountToChinese(double amount) {  
  9.         if(amount > 99999999999999.99 || amount < -99999999999999.99)  
  10.             throw new IllegalArgumentException("引數值超出允許範圍 (-99999999999999.99 ~ 99999999999999.99)!");  
  11.         boolean negative = false;  
  12.         if(amount < 0) {  
  13.             negative = true;  
  14.             amount = amount * (-1);  
  15.         }  
  16.         long temp = Math.round(amount * 100);  
  17.         int numFen = (int)(temp % 10); // 分  
  18.         temp = temp / 10;  
  19.         int numJiao = (int)(temp % 10); //角  
  20.         temp = temp / 10;  
  21.         //temp 目前是金額的整數部分  
  22.         int[] parts = new int[20]; // 其中的元素是把原來金額整數部分分割為值在 0~9999 之間的數的各個部分  
  23.         int numParts = 0; // 記錄把原來金額整數部分分割為了幾個部分(每部分都在 0~9999 之間)  
  24.         for(int i=0; ; i++) {  
  25.             if(temp ==0)  
  26.                 break;  
  27.             int part = (int)(temp % 10000);  
  28.             parts[i] = part;  
  29.             numParts ++;  
  30.             temp = temp / 10000;  
  31.         }  
  32.         boolean beforeWanIsZero = true; // 標誌“萬”下面一級是不是 0  
  33.         String chineseStr = "";  
  34.         for(int i=0; i<numParts; i++) {  
  35.             String partChinese = partTranslate(parts[i]);  
  36.             if(i % 2 == 0) {  
  37.                 if("".equals(partChinese))  
  38.                     beforeWanIsZero = true;  
  39.                 else  
  40.                     beforeWanIsZero = false;  
  41.             }  
  42.             if(i != 0) {  
  43.                 if(i % 2 == 0)  
  44.                     chineseStr = "億" + chineseStr;  
  45.                 else {  
  46.                     if("".equals(partChinese) && !beforeWanIsZero)   // 如果“萬”對應的 part 為 0,而“萬”下面一級不為 0,則不加“萬”,而加“零”  
  47.                         chineseStr = "零" + chineseStr;  
  48.                     else {  
  49.                         if(parts[i-1] < 1000 && parts[i-1] > 0) // 如果"萬"的部分不為 0, 而"萬"前面的部分小於 1000 大於 0, 則萬後面應該跟“零”  
  50.                             chineseStr = "零" + chineseStr;  
  51.                         chineseStr = "萬" + chineseStr;  
  52.                     }  
  53.                 }  
  54.             }  
  55.             chineseStr = partChinese + chineseStr;  
  56.         }  
  57.         if("".equals(chineseStr))  // 整數部分為 0, 則表達為"零元"  
  58.             chineseStr = chineseDigits[0];  
  59.         else if(negative) // 整數部分不為 0, 並且原金額為負數  
  60.             chineseStr = "負" + chineseStr;  
  61.         chineseStr = chineseStr + "元";  
  62.         if(numFen == 0 && numJiao == 0) {  
  63.             chineseStr = chineseStr + "整";  
  64.         }  
  65.         else if(numFen == 0) { // 0 分,角數不為 0  
  66.             chineseStr = chineseStr + chineseDigits[numJiao] + "角";  
  67.         }  
  68.         else { // “分”數不為 0  
  69.             if(numJiao == 0)  
  70.                 chineseStr = chineseStr + "零" + chineseDigits[numFen] + "分";  
  71.             else  
  72.                 chineseStr = chineseStr + chineseDigits[numJiao] + "角" + chineseDigits[numFen] + "分";  
  73.         }  
  74.         return chineseStr;  
  75.     }  
  76.     /** 
  77.      * 把一個 0~9999 之間的整數轉換為漢字的字串,如果是 0 則返回 "" 
  78.      * @param amountPart 
  79.      * @return 
  80.      */  
  81.     private static String partTranslate(int amountPart) {  
  82.         if(amountPart < 0 || amountPart > 10000) {  
  83.             throw new IllegalArgumentException("引數必須是大於等於 0,小於 10000 的整數!");  
  84.         }  
  85.         String[] units = new String[] {"", "拾", "佰", "仟"};  
  86.         int temp = amountPart;  
  87.         String amountStr = new Integer(amountPart).toString();  
  88.         int amountStrLength = amountStr.length();  
  89.         boolean lastIsZero = true; //在從低位往高位迴圈時,記錄上一位數字是不是 0  
  90.         String chineseStr = "";  
  91.         for(int i=0; i<amountStrLength; i++) {  
  92.             if(temp == 0)  // 高位已無資料  
  93.                 break;  
  94.             int digit = temp % 10;  
  95.             if(digit == 0) { // 取到的數字為 0  
  96.                 if(!lastIsZero)  //前一個數字不是 0,則在當前漢字串前加“零”字;  
  97.                     chineseStr = "零" + chineseStr;  
  98.                 lastIsZero = true;  
  99.             }  
  100.             else { // 取到的數字不是 0  
  101.                 chineseStr = chineseDigits[digit] + units[i] + chineseStr;  
  102.                 lastIsZero = false;  
  103.             }  
  104.             temp = temp / 10;  
  105.         }  
  106.         return chineseStr;  
  107.     }  
  108.     public static void main(String[] args) {  
  109.         if(args.length == 0) {  
  110.             System.out.println("轉換演示:");  
  111.             System.out.println("-------------------------");  
  112.             System.out.println("25000000000005.999: " + amountToChinese(25000000000005.999));  
  113.             System.out.println("45689263.626: " + amountToChinese(45689263.626));  
  114.             System.out.println("0.69457: " + amountToChinese(0.69457));  
  115.             System.out.println("253.0: " + amountToChinese(253.0));  
  116.             System.out.println("0: " + amountToChinese(0));  
  117.             System.out.println("-------------------------");  
  118.             System.out.println("999: " + amountToChinese(999));  
  119.             //System.out.println(Long.MAX_VALUE);  
  120.             //System.out.println(Long.MIN_VALUE);  
  121.         }  
  122.         else {  
  123.             System.out.println("轉換結果:");  
  124.             System.out.println(args[0] + ": " + amountToChinese(Double.parseDouble(args[0])));  
  125.         }  
  126.     }  
  127. }