java处理金额小写转大写


package test;

import java.util.HashMap; 
import java.util.Map; 
import java.util.ArrayList;

import org.apache.commons.lang.StringUtils;
public class test {

   
      private static final String[] NUMBERS = { "零", "壹", "贰", "叁", "肆", "伍", 
                      "陆", "柒", "捌", "玖" }; 
 
       
      private static final String[] IUNIT = { "元", "拾", "佰", "仟", "万", "拾", "佰", 
                      "仟", "亿", "拾", "佰", "仟", "万", "拾", "佰", "仟" }; 
 
       
      private static final String[] DUNIT = { "角", "分", "厘" }; 
 
       
      public static String toChinese(String str)   
     
              str = str.replaceAll(",", "");// 去掉"," 
                 
              String integerStr;// 整数部分数字 
                 
              String decimalStr;// 小数部分数字 
 
              // 初始化:分离整数部分和小数部分 
              if (str.indexOf(".") > 0)   
             
                      integerStr = str.substring(0, str.indexOf(".")); 
                         
                      decimalStr = str.substring(str.indexOf(".") + 1); 
                         
              } else if (str.indexOf(".") == 0)   
             
                      integerStr = ""; 
                      decimalStr = str.substring(1); 
                         
              } else   
             
                      integerStr = str; 
                      decimalStr = ""; 
             
           
              // integerStr去掉首0,不必去掉decimalStr的尾0(超出部分舍去) 
              if (!integerStr.equals(""))   
             
                      integerStr = Long.toString(Long.parseLong(integerStr)); 
                         
                      if (integerStr.equals("0"))   
                     
                      integerStr = ""; 
                   
           
               
            // overflow超出处理能力,直接返回 
            if (integerStr.length() > IUNIT.length)   
           
                    System.out.println(str + ":超出处理能力"); 
                    return str; 
           
 
            int[] integers = toArray(integerStr);// 整数部分数字 
               
            boolean isMust5 = isMust5(integerStr);// 设置万单位 
               
            int[] decimals = toArray(decimalStr);// 小数部分数字 
               
            return getChineseInteger(integers, isMust5) 
                            + getChineseDecimal(decimals); 
      }
     
       
      private static int[] toArray(String number)   
     
              int[] array = new int[number.length()]; 
                 
              for (int i = 0; i < number.length(); i++)   
             
                      array[i] = Integer.parseInt(number.substring(i, i + 1)); 
             
              return array; 
     

       
      private static String getChineseInteger(int[] integers, boolean isMust5)   
     
              StringBuffer chineseInteger = new StringBuffer(""); 
                 
              int length = integers.length; 
                 
              for (int i = 0; i < length; i++)   
             
                      // 0出现在关键位置:1234(万)5678(亿)9012(万)3456(元) 
                      // 特殊情况:10(拾元、壹拾元、壹拾万元、拾万元) 
                      String key = ""; 
                         
                      if (integers[i] == 0)   
                     
                              if ((length - i) == 13)// 万(亿)(必填) 
                             
                                      key = IUNIT[4]; 
                             
                                         
                              else if ((length - i) == 9)// 亿(必填) 
                             
                                      key = IUNIT[8]; 
                             
                                         
                              else if ((length - i) == 5 && isMust5)// 万(不必填) 
                             
                                      key = IUNIT[4]; 
                             
                                         
                              else if ((length - i) == 1)// 元(必填)   
                             
                                      key = IUNIT[0]; 
                             
                                         
                              // 0遇非0时补零,不包含最后一位 
                              if ((length - i) > 1 && integers[i + 1] != 0) 
                             
                                      key += NUMBERS[0]; 
                             
                                         
                     
                      chineseInteger.append(integers[i] == 0 ? key 
                                      : (NUMBERS[integers[i]] + IUNIT[length - i - 1])); 
             
              return chineseInteger.toString(); 
     
 
       
      private static String getChineseDecimal(int[] decimals)   
     
              StringBuffer chineseDecimal = new StringBuffer(""); 
                 
              for (int i = 0; i < decimals.length; i++)   
             
                      // 舍去3位小数之后的 
                      if (i == 3) 
                              break; 
                         
                      chineseDecimal.append(decimals[i] == 0 ? "" 
                                      : (NUMBERS[decimals[i]] + DUNIT[i])); 
             
              return chineseDecimal.toString(); 
     
 
       
      private static boolean isMust5(String integerStr)   
     
              int length = integerStr.length(); 
                 
              if (length > 4)   
             
                      String subInteger = ""; 
                         
                      if (length > 8)   
                     
                              // 取得从低位数,第5到第8位的字串 
                              subInteger = integerStr.substring(length - 8, length - 4); 
                      } else   
                     
                              subInteger = integerStr.substring(0, length - 4); 
                     
                      return Integer.parseInt(subInteger) > 0; 
              } else   
             
                      return false; 
             
     
 
       
      public static boolean isAmtEqChn(String amount, String chineseAmount) { 
 
              if (StringUtils.isBlank(chineseAmount))   
             
                      return false; 
             
 
              // 格式化大写金额去整 
              chineseAmount = chineseAmount.replace("整", ""); 
              chineseAmount = chineseAmount.replace("正", ""); 
              chineseAmount = chineseAmount.replace("人民币", ""); 
 
              chineseAmount = toSimplified(chineseAmount); 
 
              String toChnAmt = toChinese(amount); 
 
              if (chineseAmount.equals(toChnAmt))   
             
                      return true; 
             
              return false; 
     
 
       
      public static String toSimplified(String chnAmt) { 
 
              if (StringUtils.isBlank(chnAmt))   
             
                      return null; 
             
 
              char[] amtArrChar = chnAmt.toCharArray(); 
 
              Map mapping = getSimpToTradMapping(); 
 
              for (int i = 0; i < amtArrChar.length; i++)   
             
                      if (mapping.containsKey(String.valueOf(amtArrChar[i])))   
                     
                              amtArrChar[i] = mapping.get(String.valueOf(amtArrChar[i])) 
                                              .charAt(0); 
                     
             
 
              return String.valueOf(amtArrChar); 
     
 
       
      private static Map getSimpToTradMapping()   
     
 
              Map mapping = new HashMap(); 
 
              mapping.put("圆", "元"); 
              mapping.put("圓", "元"); 
              mapping.put("貳", "贰"); 
              mapping.put("陸", "陆"); 
              mapping.put("億", "亿"); 
              mapping.put("萬", "万"); 
 
              return mapping; 
     
         
      public static void main(String[] args) { 
                 
              String amount = "99999.99"; 
                 
              System.out.println("小写金额" + amount + "转换大写金额:" + toChinese("99999.99")); 
                 
              String chnAmount = "玖萬玖仟玖佰玖拾玖圓玖角玖分"; 
                 
              System.out.println(chnAmount + "-简体化:" + toSimplified(chnAmount)); 
 
              System.out.println("小写金额:" + amount + " 与 大写金额:" + chnAmount + "比较结果--------"+ isAmtEqChn(amount, chnAmount)); 
     



}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值