1. 程式人生 > >人民幣大寫轉換為數字

人民幣大寫轉換為數字

public class RMBUtils {  
  
    /** 
     * 中文中簡寫的漢字金額 經常使用 
     */  
    public static final String[] RMB_NUMBERS = new String[] { "一", "二", "三",  
            "四", "五", "六", "七", "八", "九", "兩", "廿", "卅", "○" };  
    /** 
     * 中文中繁寫的漢字金額 經常使用 
     */  
    public static final String[] BIG_RMB_NUMBERS = new String[] { "壹", "貳",  
            "叄", "肆", "伍", "陸", "柒", "捌", "玖", "倆", "廿", "卅", "零" };// 大寫的漢字  
    /** 
     * 與漢字相應的轉化的數字 
     */  
    public static final Long[] TO_ARABIC_NUMBERS = new Long[] { 1L, 2L, 3L, 4L,  
            5L, 6L, 7L, 8L, 9L, 2L, 2L, 3L, 0L };// 轉化為阿拉伯數字  
  
    /** 
     * 人民幣單位關鍵詞(即大寫數字倍數) 簡寫 注意:一定要由大到小 
     */  
    public static final String[] RMB_UNIT = new String[] { "億", "萬", "千", "百",  
            "十", "元", "角", "分", "釐" };// 中文中間隔的倍數  
    /** 
     * 人民幣單位關鍵詞 繁體寫 
     */  
    public static final String[] BIG_RMB_UNIT = new String[] { "億", "萬", "仟",  
            "佰", "拾", "圓", "角", "分", "釐" };  
  
    /** 
     * 與人民幣單位關鍵詞對應的基數 
     */  
    public static final BigDecimal[] TO_CARDINAL_NUMBERS = new BigDecimal[] {  
            new BigDecimal(100000000L), new BigDecimal(10000L),  
            new BigDecimal(1000L), new BigDecimal(100L), BigDecimal.TEN,  
            BigDecimal.ONE, new BigDecimal("0.1"), new BigDecimal("0.01"),  
            new BigDecimal("0.001") };// 轉化為阿拉伯的倍數  
  
    /** 
     * 大寫轉化為小寫的過程操作 
     *  
     * @param money 
     *            大寫金額 
     * @return 
     */  
    public static String covertToDigital(String money) {  
        BigDecimal number = getDigitalNum(money);  
        return number.toString();  
    }  
  
    /** 
     * 輔助類,處理中文數字轉換成阿拉伯數字,利用遞迴演算法 
     *  
     * @param money 
     *            人民幣大寫 
     * @return 
     */  
    private static BigDecimal getDigitalNum(String money) {  
        BigDecimal result = BigDecimal.ZERO;  
        if ((money == null || money.trim().length() <= 0)) {  
            return result;  
        }  
        // 匹配大寫金額的單位  
        for (int i = 0; i < RMB_UNIT.length; i++) {  
            // 查詢字元中的簡、繁單位  
            int index = money.lastIndexOf(RMB_UNIT[i]) == -1 ? money  
                    .lastIndexOf(BIG_RMB_UNIT[i]) : money  
                    .lastIndexOf(RMB_UNIT[i]);  
            if (index >= 0) {  
                String pre_money = money.substring(0, index); // 擷取當前單位的  
                                                                // 前面的中文字串  
                money = money.substring(index + 1); // 擷取當前單位後面的字串 ,進行下一次迭代比較  
                if ((pre_money == null || pre_money.length() <= 0)  
                        && TO_CARDINAL_NUMBERS[i].intValue() == 10) { // 處理拾開頭的特殊字元  例如 拾、 十  
                    result = result.add(TO_CARDINAL_NUMBERS[i]);  
                } else { // 對當前單位擷取的前面的字元 遞迴處理  
                    result = result.add(getDigitalNum(pre_money).multiply(  
                            TO_CARDINAL_NUMBERS[i]));  
                }  
            }  
        }  
        // 如果不帶單位 直接阿拉伯數字匹配替換  
        if (money != null && money.length() > 0) {  
            result = result.add(getArabicNumByBig(money));  
        }  
        return result;  
    }  
  
    /** 
     * 輔助類,中文數字 轉化為對應的阿拉伯數字 
     *  
     * @param big 
     * @return 
     */  
    private static BigDecimal getArabicNumByBig(String big) {  
        BigDecimal result = BigDecimal.ZERO;  
        for (int j = 0; j < RMB_NUMBERS.length; j++) {  
            big = big.replaceAll(RMB_NUMBERS[j],  
                    TO_ARABIC_NUMBERS[j].toString()); // 中文小寫替換  
            big = big.replaceAll(BIG_RMB_NUMBERS[j],  
                    TO_ARABIC_NUMBERS[j].toString());// 中文大寫替換  
        }  
        try {  
            result = new BigDecimal(big);  
        } catch (Exception e) {  
            result = BigDecimal.ZERO;  
        }  
        return result;  
    }  
  
    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
       // System.out.println("---------------------測試資料----------------");  
        System.out.println(covertToDigital("陸仟萬元整"));  
        System.out.println(covertToDigital("一百萬億兩分"));  
        System.out.println(covertToDigital("壹萬億"));  
        System.out.println(covertToDigital("貳萬億"));  
        System.out.println(covertToDigital("叄萬億"));  
        System.out.println(covertToDigital("肆萬億"));  
        System.out.println(covertToDigital("伍萬億"));  
        System.out.println(covertToDigital("陸萬億"));  
        System.out.println(covertToDigital("柒萬億"));  
        System.out.println(covertToDigital("捌萬億"));  
        System.out.println(covertToDigital("玖萬億"));  
        System.out.println(covertToDigital("拾萬億"));  
        System.out.println(covertToDigital("十一元三角兩分"));  
        System.out.println(covertToDigital("十一元"));  
  
    }  
  
}