金额操作的工具类
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了金额操作的工具类相关的知识,希望对你有一定的参考价值。
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 }
以上是关于金额操作的工具类的主要内容,如果未能解决你的问题,请参考以下文章