阿拉伯數字和中文金額之間的相互轉化

 一個工具類,提供了阿拉伯數字和中文金額之間的相互轉化。直接可以使用

代碼如下:

 

  1. package org.pengxiaofei.common.tools; 
  2.  
  3. import java.text.NumberFormat; 
  4. import java.util.HashMap; 
  5. import java.util.Map; 
  6. /*** 
  7.  *本工具類主要提供數字和中文金額的相互轉化 
  8.  *  
  9.  * @author 朱鵬飛 
  10.  * 
  11.  *@version 1.0 
  12.  */ 
  13. public class NumberConvertUtil { 
  14.  
  15.     /** 
  16.      * 將數字轉成中文金額 
  17.      *  
  18.      * @param num 
  19.      * @return 
  20.      */ 
  21.     public static String translate(int num) { 
  22.  
  23.         return translate((long) num); 
  24.     } 
  25.  
  26.     /** 
  27.      * 將數字轉成以逗號分開 
  28.      *  
  29.      * @param num 
  30.      * @return 
  31.      */ 
  32.     public static String getCommaNumber(long num) { 
  33.  
  34.         return NumberFormat.getInstance().format(num) + ".00"
  35.     } 
  36.  
  37.     /** 
  38.      * 將數字轉成中文金額 
  39.      *  
  40.      * @param num 
  41.      * @return 
  42.      */ 
  43.     public static String translate(long num) { 
  44.  
  45.         return translate(num, true); 
  46.     } 
  47.  
  48.     /** 
  49.      * 將數字轉成中文 
  50.      *  
  51.      * @param num 
  52.      * @param isHead 
  53.      *            是否爲高位 
  54.      * @return 
  55.      */ 
  56.     private static String translate(long num, boolean isHead) { 
  57.  
  58.         StringBuilder result = new StringBuilder(); 
  59.  
  60.         // 求出數字的總位數 
  61.         int size = String.valueOf(num).length(); 
  62.  
  63.         // 數字可分成萬的端數 
  64.         int powerNum = (size % 4 == 0) ? (size / 4 - 1) : (size / 4); 
  65.  
  66.         // 先取出最高一段,轉換成中文數字 
  67.         result.append(getBelowTenThousandString( 
  68.                 (int) (num / getPower(powerNum)), isHead)); 
  69.  
  70.         // 添加最高端的萬級別的單位 
  71.         result.append(getBigUnit(powerNum)); 
  72.  
  73.         // 再遞歸添加低端位數字轉化成的中文 
  74.  
  75.         long leftNum = num % (long) getPower(powerNum); 
  76.  
  77.         if (leftNum != 0) { 
  78.  
  79.             result.append(translate(leftNum, false)); 
  80.         } 
  81.  
  82.         return result.toString(); 
  83.  
  84.     } 
  85.  
  86.     /** 
  87.      * 獲取萬以下的數字的表示法 
  88.      *  
  89.      * @param num 
  90.      *            數字 
  91.      * @param isHead 
  92.      *            是否爲一個數字的高位,如1234不是10001234的高位,而1000是10001234的高位 
  93.      * @return 
  94.      */ 
  95.     private static String getBelowTenThousandString(int num, boolean isHead) { 
  96.  
  97.         char[] chineseNum = { '零''壹''貳''叄''肆''伍''陸''柒''捌''玖' }; 
  98.  
  99.         char[] smallUnit = { '仟''佰''拾' }; 
  100.  
  101.         // 先判斷是否爲零 
  102.         if (num == 0) { 
  103.  
  104.             // 是高位則添加零(因爲它就是零),否則返回空字符串 
  105.             if (isHead) { 
  106.  
  107.                 return String.valueOf(chineseNum[0]); 
  108.             } else { 
  109.  
  110.                 return ""
  111.             } 
  112.  
  113.         } 
  114.  
  115.         // 仟、佰、拾、個位是否爲零 
  116.         boolean[] isNotZero = new boolean[4]; 
  117.  
  118.         StringBuilder result = new StringBuilder(); 
  119.  
  120.         // 低位如果小於1000就要就加零連接高位 
  121.  
  122.         if (num < 1000 && !isHead) { 
  123.  
  124.             result.append(chineseNum[0]); 
  125.         } 
  126.  
  127.         // 千位的處理 
  128.         int leftNum = num; 
  129.         if (num >= 1000) { 
  130.  
  131.             result.append(chineseNum[num / 1000]); 
  132.             result.append(smallUnit[0]); 
  133.             isNotZero[0] = true
  134.         } 
  135.  
  136.         // 百位的處理 
  137.         leftNum = num % 1000
  138.         if (leftNum / 100 != 0) { 
  139.  
  140.             result.append(chineseNum[leftNum / 100]); 
  141.             result.append(smallUnit[1]); 
  142.             isNotZero[1] = true
  143.         } else { 
  144.  
  145.             if (isNotZero[0] && ((num % 1000) != 0)) { 
  146.  
  147.                 result.append(chineseNum[0]); 
  148.             } 
  149.  
  150.         } 
  151.  
  152.         // 十位的處理 
  153.         leftNum = num % 100
  154.         if (leftNum / 10 != 0) { 
  155.  
  156.             if (leftNum / 10 != 1 || num >= 100) { 
  157.  
  158.                 result.append(chineseNum[leftNum / 10]); 
  159.             } 
  160.  
  161.             result.append(smallUnit[2]); 
  162.             isNotZero[2] = true
  163.         } else { 
  164.  
  165.             if (isNotZero[1] && ((num % 100) != 0)) { 
  166.                 result.append(chineseNum[0]); 
  167.             } 
  168.  
  169.         } 
  170.  
  171.         // 個位的處理 
  172.         leftNum = num % 10
  173.         if (leftNum != 0) { 
  174.  
  175.             result.append(chineseNum[leftNum]); 
  176.             isNotZero[3] = true
  177.         } 
  178.  
  179.         return result.toString(); 
  180.     } 
  181.  
  182.     /** 
  183.      * 獲取萬的num次方的單位(萬,億,萬億,億億之類的) 
  184.      *  
  185.      * @param num 
  186.      * @return 
  187.      */ 
  188.     private static String getBigUnit(int num) { 
  189.  
  190.         char[] bigUnit = { '萬''億' }; 
  191.  
  192.         if (num == 0) { 
  193.  
  194.             return ""
  195.         } 
  196.  
  197.         String unitString = getBigUnit(num - 1); 
  198.  
  199.         return (unitString.indexOf(bigUnit[0]) > -1) ? 
  200.  
  201.         (unitString.replace(bigUnit[0], bigUnit[1])) 
  202.                 : (bigUnit[0] + unitString); 
  203.  
  204.     } 
  205.  
  206.     /** 
  207.      * 獲取一萬的size次冪 
  208.      *  
  209.      * @param size 
  210.      * @return 
  211.      */ 
  212.     private static Long getPower(int size) { 
  213.  
  214.         if (size > 4) { 
  215.  
  216.             throw new IllegalArgumentException("數字超過範圍"); 
  217.         } 
  218.  
  219.         Long result = 1L; 
  220.  
  221.         for (int i = 0; i < size; i++) { 
  222.  
  223.             result *= 10000L; 
  224.         } 
  225.  
  226.         return result; 
  227.     } 
  228.  
  229.     /*** 
  230.      *中文金額字符 
  231.      */ 
  232.     private static final Character[] CN_NUMERIC = { '一''二''三''四''五'
  233.             '六''七''八''九''壹''貳''叄''肆''伍''陸''柒''捌''玖'
  234.             '十''百''千''拾''佰''仟''萬''億''○''O''零' }; 
  235.  
  236.     private static Map<Character, Integer> cnNumeric = null
  237.  
  238.     static { 
  239.         cnNumeric = new HashMap<Character, Integer>(400.85f); 
  240.         for (int j = 0; j < 9; j++) 
  241.             cnNumeric.put(CN_NUMERIC[j], j + 1); 
  242.         for (int j = 9; j < 18; j++) 
  243.             cnNumeric.put(CN_NUMERIC[j], j - 8); 
  244.         cnNumeric.put('兩'2); 
  245.         cnNumeric.put('十'10); 
  246.         cnNumeric.put('拾'10); 
  247.         cnNumeric.put('百'100); 
  248.         cnNumeric.put('佰'100); 
  249.         cnNumeric.put('千'1000); 
  250.         cnNumeric.put('仟'1000); 
  251.         cnNumeric.put('萬'10000); 
  252.         cnNumeric.put('億'100000000); 
  253.     } 
  254.  
  255.     public static int isCNNumeric(char c) { 
  256.         Integer i = cnNumeric.get(c); 
  257.         if (i == null
  258.             return -1
  259.         return i.intValue(); 
  260.     } 
  261.     /*** 
  262.      * 將中文金額數字轉換爲阿拉伯數字 
  263.      * @param cnn 
  264.      * @param flag 是否有繁體的中文單位(佰,仟,拾) 
  265.      * @return 
  266.      */ 
  267.     public static int cnNumericToArabic(String cnn, boolean flag) { 
  268.  
  269.         cnn = cnn.trim(); 
  270.         if (cnn.length() == 1
  271.             return isCNNumeric(cnn.charAt(0)); 
  272.  
  273.         if (flag) 
  274.             cnn = cnn.replace('佰''百').replace('仟''千').replace('拾''十'
  275.                     .replace('零'' '); 
  276.         // System.out.println(cnn); 
  277.         int yi = -1, wan = -1, qian = -1, bai = -1, shi = -1
  278.         int val = 0
  279.         yi = cnn.lastIndexOf('億'); 
  280.         if (yi > -1) { 
  281.             val += cnNumericToArabic(cnn.substring(0, yi), false) * 100000000
  282.             if (yi < cnn.length() - 1
  283.                 cnn = cnn.substring(yi + 1, cnn.length()); 
  284.             else 
  285.                 cnn = ""
  286.  
  287.             if (cnn.length() == 1) { 
  288.                 int arbic = isCNNumeric(cnn.charAt(0)); 
  289.                 if (arbic <= 10
  290.                     val += arbic * 10000000
  291.                 cnn = ""
  292.             } 
  293.         } 
  294.  
  295.         wan = cnn.lastIndexOf('萬'); 
  296.         if (wan > -1) { 
  297.             val += cnNumericToArabic(cnn.substring(0, wan), false) * 10000
  298.             if (wan < cnn.length() - 1
  299.                 cnn = cnn.substring(wan + 1, cnn.length()); 
  300.             else 
  301.                 cnn = ""
  302.             if (cnn.length() == 1) { 
  303.                 int arbic = isCNNumeric(cnn.charAt(0)); 
  304.                 if (arbic <= 10
  305.                     val += arbic * 1000
  306.                 cnn = ""
  307.             } 
  308.         } 
  309.  
  310.         qian = cnn.lastIndexOf('千'); 
  311.         if (qian > -1) { 
  312.             val += cnNumericToArabic(cnn.substring(0, qian), false) * 1000
  313.             if (qian < cnn.length() - 1
  314.                 cnn = cnn.substring(qian + 1, cnn.length()); 
  315.             else 
  316.                 cnn = ""
  317.             if (cnn.length() == 1) { 
  318.                 int arbic = isCNNumeric(cnn.charAt(0)); 
  319.                 if (arbic <= 10
  320.                     val += arbic * 100
  321.                 cnn = ""
  322.             } 
  323.         } 
  324.  
  325.         bai = cnn.lastIndexOf('百'); 
  326.         if (bai > -1) { 
  327.             val += cnNumericToArabic(cnn.substring(0, bai), false) * 100
  328.             if (bai < cnn.length() - 1
  329.                 cnn = cnn.substring(bai + 1, cnn.length()); 
  330.             else 
  331.                 cnn = ""
  332.             if (cnn.length() == 1) { 
  333.                 int arbic = isCNNumeric(cnn.charAt(0)); 
  334.                 if (arbic <= 10
  335.                     val += arbic * 10
  336.                 cnn = ""
  337.             } 
  338.         } 
  339.  
  340.         shi = cnn.lastIndexOf('十'); 
  341.         if (shi > -1) { 
  342.             if (shi == 0
  343.                 val += 1 * 10
  344.             else 
  345.                 val += cnNumericToArabic(cnn.substring(0, shi), false) * 10
  346.             if (shi < cnn.length() - 1
  347.                 cnn = cnn.substring(shi + 1, cnn.length()); 
  348.             else 
  349.                 cnn = ""
  350.         } 
  351.  
  352.         cnn = cnn.trim(); 
  353.         for (int j = 0; j < cnn.length(); j++) 
  354.             val += isCNNumeric(cnn.charAt(j)) 
  355.                     * Math.pow(10, cnn.length() - j - 1); 
  356.  
  357.         return val; 
  358.     } 
  359.  
  360.  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章