话不多说,直接上代码
import org.apache.commons.lang3.StringUtils;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import java.util.Stack;
public class MoneyUtil {
private static final Map<Character, Integer> CN_NUM_MAP;
private static final Map<Character, BigDecimal> UNIT_MAP;
static {
CN_NUM_MAP = new HashMap<>(16);
CN_NUM_MAP.put('零', 0);
CN_NUM_MAP.put('壹', 1);
CN_NUM_MAP.put('贰', 2);
CN_NUM_MAP.put('叁', 3);
CN_NUM_MAP.put('肆', 4);
CN_NUM_MAP.put('伍', 5);
CN_NUM_MAP.put('陆', 6);
CN_NUM_MAP.put('柒', 7);
CN_NUM_MAP.put('捌', 8);
CN_NUM_MAP.put('玖', 9);
UNIT_MAP = new HashMap<>();
UNIT_MAP.put('厘', new BigDecimal("0.001"));
UNIT_MAP.put('分', new BigDecimal("0.01"));
UNIT_MAP.put('角', new BigDecimal("0.1"));
UNIT_MAP.put('圆', new BigDecimal("1"));
UNIT_MAP.put('拾', new BigDecimal("10"));
UNIT_MAP.put('佰', new BigDecimal("100"));
UNIT_MAP.put('仟', new BigDecimal("1000"));
UNIT_MAP.put('万', new BigDecimal("10000"));
UNIT_MAP.put('亿', new BigDecimal("100000000"));
}
public static void main(String[] args) {
System.out.println(MoneyUtil.chinese2Number("壹万伍仟肆佰壹拾圆叁角伍分肆厘"));
}
/**
* 校验字符串是否全部为大写金额的字符
*/
public static boolean isChineseMoney(String money) {
if (StringUtils.isBlank(money)) {
return false;
}
for (char ch : money.toCharArray()) {
if (!CN_NUM_MAP.containsKey(ch) && !UNIT_MAP.containsKey(ch)) {
return false;
}
}
return true;
}
/**
* 中文金额转数字
*/
public static BigDecimal chinese2Number(String chineseNumber) {
Stack<BigDecimal> stack = new Stack<>();
for (char ch : chineseNumber.toCharArray()) {
if (CN_NUM_MAP.containsKey(ch)) {
stack.push(BigDecimal.valueOf(CN_NUM_MAP.get(ch)));
} else {
BigDecimal decimal = UNIT_MAP.get(ch);
if (stack.empty()) {
stack.push(decimal);
continue;
}
if (decimal.compareTo(new BigDecimal(1)) < 0) {
stack.push(decimal.multiply(stack.pop()));
continue;
}
BigDecimal tempDecimal = new BigDecimal(0);
while (!stack.isEmpty()) {
if (stack.peek().compareTo(decimal) > 0) {
break;
}
tempDecimal = tempDecimal.add(decimal.multiply(stack.pop()));
}
stack.push(tempDecimal);
}
}
BigDecimal resultDecimal = new BigDecimal(0);
while (!stack.isEmpty()) {
resultDecimal = resultDecimal.add(stack.pop());
}
return resultDecimal;
}
}