在金融行业中经常需要把大写金额转成小写金额,之前在一次开发中有个类似的需求,翻阅了好多博文,都没找到合适的,故没办法,就花了点时间研究并实现!
实现代码如下:
java
private static final Character ZERO = '零';
private static final String DIME = "角";
private static final String CENT = "分";
private static final String DOLLAR = "元";
private static final String THOUSAND = "万";
private static final String HUNDRED_MILLION = "亿";
private static final List<Character> unitList = Arrays.asList('圆', '元', '拾', '佰', '仟', '万', '亿');
static Map<Char, Integer> numberMap = new HashMap(10) {{
put('零', 0);
put('壹', 1);
put('贰', 2);
put('叁', 3);
put('肆', 4);
put('伍', 5);
put('陆', 6);
put('柒', 7);
put('捌', 8);
put('玖', 9);
}};
static Map<Char, Long> unitZeroMap = new HashMap(7) {{
put('亿', 100000000L);
put('万', 10000L);
put('仟', 1000L);
put('佰', 100L);
put('拾', 10L);
put('元', 1L);
put('圆', 1L);
}};
/**
* 把大写金额转换为单位为分的数字
*/
public static long convertMoneyNum(String money) {
// 按亿/万/元(圆)/角/分拆分大写金额
List<String> moneyList = buildMoneyList(money);
long moneyNum = 0;
long centMoneyNum = 0;
for (String moneyStr : moneyList) {
if (moneyStr.endsWith(DIME)) {
centMoneyNum += (numberMap.get(moneyStr.charAt(0)) * 10); // 大写角转数字分
} else if (moneyStr.endsWith(CENT)) {
centMoneyNum += numberMap.get(moneyStr.charAt(0)); // 大写分转数字分
} else {
moneyNum += convertNum(moneyStr); // 大写亿/万/元(圆)转数字元
}
}
// 返回计算后的数字分
return moneyNum * 100 + centMoneyNum;
}
private static long convertNum(String moneyStr) {
char[] chars = moneyStr.toCharArray();
Set<Char> unitZeroList = unitZeroMap.keySet();
long moneyNumber = 0;
int indexNum = 0;
int maxIndex = 0;
Character preUnit = null;
for (int i=0; i<chars.length; i++) {
char currNum = chars[i];
// 处理字符零
if (currNum == ZERO) {
preUnit = null;
continue;
}
if (unitZeroList.contains(currNum)) { // 处理字符为单位
long unitNum = unitZeroMap.get(currNum);
if (preUnit != null) {
moneyNumber = moneyNumber * unitNum;
preUnit = null;
} else {
int currIndex = unitList.indexOf(currNum);
if (currIndex > maxIndex) {
maxIndex = currIndex;
moneyNumber = (moneyNumber + indexNum) * unitNum;
} else {
moneyNumber = moneyNumber + indexNum * unitNum;
}
preUnit = currNum;
}
} else {
indexNum = numberMap.get(currNum); // 处理字符为数字
if (i == chars.length-1) { // 最后一个字符为数字
moneyNumber = moneyNumber + indexNum;
}
preUnit = null;
}
}
return moneyNumber;
}
private static List<String> buildMoneyList(String money) {
List<String> moneyList = new ArrayList<>();
int startIndex = 0;
// 亿
if (money.contains(HUNDRED_MILLION)) {
startIndex = buildMoneyList(HUNDRED_MILLION, moneyList, money, startIndex);
}
// 万
if (money.contains(THOUSAND)) {
startIndex = buildMoneyList(THOUSAND, moneyList, money, startIndex);
}
// 元
if (money.contains(DOLLAR)) {
startIndex = buildMoneyList(DOLLAR, moneyList, money, startIndex);
}
// 角
if (money.contains(DIME)) {
startIndex = buildMoneyList(DIME, moneyList, money, startIndex);
}
// 分
if (startIndex < money.length()) {
moneyList.add(money.substring(startIndex));
}
return moneyList;
}
private static int buildMoneyList(String unit, List<String> moneyList, String money, int startIndex) {
int endIndex = money.indexOf(unit) + 1;
moneyList.add(money.substring(startIndex, endIndex));
return endIndex;
}
已有好多年没写过博文了,今天记录哈!!!!