1. 程式人生 > >金額操作的工具類

金額操作的工具類

ive char acea log rst reverse this emp arr

  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 }

金額操作的工具類