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)); 
     



}
//ChangeRMB.java /** * * programmed by HuangHeliang * 2009.04.15 10:20:51 * */ //package com.avtech.hhl; import java.io.*; public final class ChangeRMB { //每个数字对应的大写 private static final String[] num = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖", }; //从低到高排列的单位 private static final String[] bit = { "圆", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿" }; //金额里面的角和分 private static final String[] jf={ "角","分" }; /** * 处理金额的整数部分,返回"...圆整" * @param integer * @return String * @throws Exception */ public static String praseUpcaseRMB(String integer)throws Exception{ StringBuilder sbdr=new StringBuilder(""); int j=integer.length(); if(j>bit.length){ throw new Exception("\n只能处理亿万亿以内的数据(含亿万亿)!"); } char[] rmb=integer.toCharArray(); for (int i = 0; i 壹佰亿陆仟伍佰万肆仟伍佰捌拾叁圆零伍分 */ if(bit[bitLocate].equals("仟")){ String s=sbdr.toString(); if(!s.endsWith(bit[bitLocate+1]) && s.length()>0){ if (s.endsWith(num[0])) { sbdr.deleteCharAt(sbdr.length() - 1); } sbdr.append(bit[bitLocate+1]); } } sbdr.append(num[numLocate]); sbdr.append(bit[bitLocate]); }//end for /* * 去掉结尾"零"后,补全 */ if(sbdr.toString().endsWith(num[0])){ sbdr.deleteCharAt(sbdr.length()-1); sbdr.append("圆整"); }else{ sbdr.append("整"); } return sbdr.toString(); } /** * 处理带小数的金额,整数部分交由上一个方法处理,小数部分自己处理 * @param integer * @param decimal * @return String * @throws Exception */ public static String praseUpcaseRMB(String integer, String decimal)throws Exception{ String ret=ChangeRMB.praseUpcaseRMB(integer); ret=ret.split("整")[0]; //处理整数部分 StringBuilder sbdr=new StringBuilder(""); sbdr.append(ret); char[] rmbjf=decimal.toCharArray(); for(int i=0;i rmbDouble){ theInt-=1; } double theDecimal=rmbDouble-theInt; String integer=new Long((long)theInt).toString(); String decimal=""+Math.round(theDecimal*100); if(decimal.equals("0")){ result=ChangeRMB.praseUpcaseRMB(integer); }else{ result=ChangeRMB.praseUpcaseRMB(integer, decimal); } return result; } public static void main(String[] args) throws Exception{ System.out.print("输入小写人民币金额:"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String in = br.readLine(); String result=ChangeRMB.doChangeRMB(in); System.out.println("\n"+"------------换结果------------"); System.out.println(result); double d=54628569856.68; String ret=ChangeRMB.doChangeRMB(d); System.out.println("\n"+"------------换结果------------"); System.out.println(ret); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值