首页 > 代码库 > 金额操作的工具类

金额操作的工具类

  1 public class MoneyUtil {
  2     private static final Map<String, String> zeroToNineHt;    //用于存储0-9大写的哈希表
  3     private static final Map<Integer, String> shiBaiQianHt;    //用于存储十百千大写的哈希表
  4     private static final Map<Integer, String> wanYiZhaoHt;    //用于存储萬億兆大写的哈希表
  5 
  6     static {
  7         zeroToNineHt = new Hashtable<String, String>();
  8         zeroToNineHt.put("0", "零");
  9         zeroToNineHt.put("1", "壹");
 10         zeroToNineHt.put("2", "贰");
 11         zeroToNineHt.put("3", "叁");
 12         zeroToNineHt.put("4", "肆");
 13         zeroToNineHt.put("5", "伍");
 14         zeroToNineHt.put("6", "陆");
 15         zeroToNineHt.put("7", "柒");
 16         zeroToNineHt.put("8", "捌");
 17         zeroToNineHt.put("9", "玖");
 18 
 19         shiBaiQianHt = new Hashtable<Integer, String>();
 20         shiBaiQianHt.put(0, "");
 21         shiBaiQianHt.put(1, "拾");
 22         shiBaiQianHt.put(2, "佰");
 23         shiBaiQianHt.put(3, "仟");
 24 
 25         wanYiZhaoHt = new Hashtable<Integer, String>();
 26         wanYiZhaoHt.put(0, "");
 27         wanYiZhaoHt.put(1, "萬");
 28         wanYiZhaoHt.put(2, "億");
 29         wanYiZhaoHt.put(3, "兆");//按照阅读习惯应该是“萬億”
 30     }
 31     
 32     /**
 33      * 将数字类型的金额转化成大写的人民币格式
 34      * 
 35      * @param obj
 36      * @return
 37      */
 38     public static String transToRMB(Object obj) {
 39         String number = String.valueOf(obj);
 40         number = StrUtil.formatNull(number,"0");
 41         String formalNumber = new BigDecimal(number).toString();
 42         MoneyUtil moneyUtil = new MoneyUtil();
 43         String[] arr = formalNumber.split("[.]");// 拆分成整数部分和小数部分
 44         String retVal = moneyUtil.parseIntegerPart(arr[0]);// 整数部分
 45         if (arr.length == 2 && Float.parseFloat(arr[1]) > 0) {
 46             retVal += moneyUtil.parseFloatPart(arr[1]);// 小数部分
 47         }
 48         return retVal;
 49     }
 50 
 51     /**
 52      * 得到整数部分的汉字大写表示
 53      * 
 54      * @return
 55      */
 56     private String parseIntegerPart(String integerPart) {
 57         // 将整数部分逆序,因为需要反向读取
 58         String reverseIntegerPart = "";
 59         for (int i = integerPart.length() - 1; i > -1; i--) {
 60             reverseIntegerPart += integerPart.charAt(i);
 61         }
 62 
 63         // 将整数部分按四位分组
 64         Pattern p = Pattern.compile("\\d{4}", Pattern.CASE_INSENSITIVE);
 65         Matcher m = p.matcher(reverseIntegerPart);
 66         StringBuffer sb = new StringBuffer();
 67         boolean result = m.find();
 68         while (result) {
 69             m.appendReplacement(sb, m.group(0) + ",");
 70             result = m.find();
 71         }
 72         m.appendTail(sb);
 73 
 74         String retVal = "";
 75         String[] arr = sb.toString().split(",");
 76         for (int i = arr.length - 1; i >= 0; i--) {
 77             for (int j = arr[i].length() - 1; j >= 0; j--) {
 78                 String str = String.valueOf(arr[i].charAt(j));
 79                 retVal += zeroToNineHt.get(str) + shiBaiQianHt.get(j);//加单位(十百千)
 80             }
 81             retVal += wanYiZhaoHt.get(i % 4);// 加单位(万亿兆)
 82             retVal = this.formatZero(retVal);
 83         }
 84 
 85         // 格式化
 86         retVal = this.formatZero(retVal);
 87         if(retVal.startsWith("壹拾")){
 88             retVal = retVal.replaceFirst("壹拾", "拾");//按照阅读习惯,第一个"壹拾"应该读作“拾”
 89         }
 90         return StrUtil.formatNull(retVal, "零");
 91     }
 92 
 93     /**
 94      * 得到小数部分的汉字大写表示
 95      * 
 96      * @return
 97      */
 98     private String parseFloatPart(String floatPart) {
 99         String retVal = "点";
100         for (int i = 0; i < floatPart.length(); i++) {
101             String temp = String.valueOf(floatPart.charAt(i));
102             retVal += zeroToNineHt.get(temp);
103         }
104         return retVal;
105     }
106 
107     /**
108      * 格式化零
109      * 
110      * @return
111      */
112     private String formatZero(String str){
113         str = str.replaceAll("(零[萬仟佰拾])", "零");
114         str = str.replaceAll("(零{2,})", "零");// 多个零的话,只取一个
115         str = str.replaceAll("(零)($)", "$2");// 零在末尾则去掉
116         return str;
117     }
118 }

 

金额操作的工具类