将数字转为中文金额的大写方式

  1. 2008-06-22 @ Tag java   人气:1
    1. /*  
    2.  * Amount2RMB.java 2008-6-15   
    3.  */  
    4. package test;   
    5.   
    6. import java.util.regex.Matcher;   
    7. import java.util.regex.Pattern;   
    8.   
    9. public class Amount2RMB {   
    10.     private static final Pattern AMOUNT_PATTERN =    
    11.             Pattern.compile("^(0|[1-9]\\d{0,11})\\.(\\d\\d)$"); // 不考虑分隔符的正确性   
    12.     private static final char[] RMB_NUMS = "零壹贰叁肆伍陆柒捌玖".toCharArray();   
    13.     private static final String[] UNITS = {"元""角""分""整"};   
    14.     private static final String[] U1 = {"""拾""佰""仟"};   
    15.     private static final String[] U2 = {"""万""亿"};   
    16.   
    17.     /**  
    18.      * 将金额(整数部分等于或少于12位,小数部分2位)转换为中文大写形式.  
    19.      * @param amount 金额数字  
    20.      * @return       中文大写  
    21.      * @throws IllegalArgumentException  
    22.      */  
    23.     public static String convert(String amount) throws IllegalArgumentException {   
    24.         // 去掉分隔符   
    25.         amount = amount.replace(",""");   
    26.   
    27.         // 验证金额正确性   
    28.         if (amount.equals("0.00")) {   
    29.             throw new IllegalArgumentException("金额不能为零.");   
    30.         }   
    31.         Matcher matcher = AMOUNT_PATTERN.matcher(amount);   
    32.         if (! matcher.find()) {   
    33.             throw new IllegalArgumentException("输入金额有误.");   
    34.         }   
    35.   
    36.         String integer  = matcher.group(1); // 整数部分   
    37.         String fraction = matcher.group(2); // 小数部分   
    38.   
    39.         String result = "";   
    40.         if (! integer.equals("0")) {   
    41.             result += integer2rmb(integer) + UNITS[0]; // 整数部分   
    42.         }   
    43.         if (fraction.equals("00")) {   
    44.             result += UNITS[3]; // 添加[整]   
    45.         } else if (fraction.startsWith("0") && integer.equals("0")) {   
    46.             result += fraction2rmb(fraction).substring(1); // 去掉分前面的[零]   
    47.         } else {   
    48.             result += fraction2rmb(fraction); // 小数部分   
    49.         }   
    50.   
    51.         return result;   
    52.     }   
    53.   
    54.     // 将金额小数部分转换为中文大写   
    55.     private static String fraction2rmb(String fraction) {   
    56.         char jiao = fraction.charAt(0); // 角   
    57.         char fen  = fraction.charAt(1); // 分   
    58.         return (RMB_NUMS[jiao - '0'] + (jiao > '0' ? UNITS[1] : ""))   
    59.                 + (fen > '0' ? RMB_NUMS[fen - '0'] + UNITS[2] : "");   
    60.     }   
    61.   
    62.     // 将金额整数部分转换为中文大写   
    63.     private static String integer2rmb(String integer) {   
    64.         StringBuilder buffer = new StringBuilder();   
    65.         // 从个位数开始转换   
    66.         int i, j;   
    67.         for (i = integer.length() - 1, j = 0; i >= 0; i--, j++) {   
    68.             char n = integer.charAt(i);   
    69.             if (n == '0') {   
    70.                 // 当n是0且n的右边一位不是0时,插入[零]   
    71.                 if (i < integer.length() - 1 && integer.charAt(i + 1) != '0') {   
    72.                     buffer.append(RMB_NUMS[0]);   
    73.                 }   
    74.                 // 插入[万]或者[亿]   
    75.                 if (j % 4 == 0) {   
    76.                     if (i > 0 && integer.charAt(i - 1) != '0'  
    77.                             || i > 1 && integer.charAt(i - 2) != '0'  
    78.                             || i > 2 && integer.charAt(i - 3) != '0') {   
    79.                         buffer.append(U2[j / 4]);   
    80.                     }   
    81.                 }   
    82.             } else {   
    83.                 if (j % 4 == 0) {   
    84.                     buffer.append(U2[j / 4]);     // 插入[万]或者[亿]   
    85.                 }   
    86.                 buffer.append(U1[j % 4]);         // 插入[拾]、[佰]或[仟]   
    87.                 buffer.append(RMB_NUMS[n - '0']); // 插入数字   
    88.             }   
    89.         }   
    90.         return buffer.reverse().toString();   
    91.     }   
    92.   
    93.     public static void main(String[] args) {   
    94.         // log4j?   
    95.         System.out.println("壹万陆仟肆佰零玖元零贰分".equals(convert("16,409.02")));   
    96.         System.out.println("壹仟肆佰零玖元伍角".equals(convert("1,409.50")));   
    97.         System.out.println("陆仟零柒元壹角肆分".equals(convert("6,007.14")));   
    98.         System.out.println("壹仟陆佰捌拾元叁角贰分".equals(convert("1,680.32")));   
    99.         System.out.println("叁佰贰拾伍元零肆分".equals(convert("325.04")));   
    100.         System.out.println("肆仟叁佰贰拾壹元整".equals(convert("4,321.00")));   
    101.         System.out.println("壹分".equals(convert("0.01")));   
    102.            
    103.         System.out.println(convert("1234,5678,9012.34")   
    104.                 .equals("壹仟贰佰叁拾肆亿伍仟陆佰柒拾捌万玖仟零壹拾贰元叁角肆分"));   
    105.         System.out.println(convert("1000,1000,1000.10")   
    106.                 .equals("壹仟亿零壹仟万零壹仟元壹角"));   
    107.         System.out.println(convert("9009,9009,9009.99")   
    108.                 .equals("玖仟零玖亿玖仟零玖万玖仟零玖元玖角玖分"));   
    109.         System.out.println(convert("5432,0001,0001.01")   
    110.                 .equals("伍仟肆佰叁拾贰亿零壹万零壹元零壹分"));   
    111.         System.out.println(convert("1000,0000,1110.00")   
    112.                 .equals("壹仟亿零壹仟壹佰壹拾元整"));   
    113.         System.out.println(convert("1010,0000,0001.11")   
    114.                 .equals("壹仟零壹拾亿零壹元壹角壹分"));   
    115.         System.out.println(convert("1000,0000,0000.01")   
    116.                 .equals("壹仟亿元零壹分"));   
    117.     }   
    118. }  

感谢易载提供各种支持!
文章分类