先看结果:
废话不多说 直接上代码:
package com.ht.commons;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
public class ChineseRMBConverter {
private static final Map<Character, BigDecimal> numMap = new HashMap<>();
private static final Map<Character, BigDecimal> unitMap = new HashMap<>();
static {
numMap.put('零', new BigDecimal("0"));
numMap.put('壹', new BigDecimal("1"));
numMap.put('贰', new BigDecimal("2"));
numMap.put('叁', new BigDecimal("3"));
numMap.put('肆', new BigDecimal("4"));
numMap.put('伍', new BigDecimal("5"));
numMap.put('陆', new BigDecimal("6"));
numMap.put('柒', new BigDecimal("7"));
numMap.put('捌', new BigDecimal("8"));
numMap.put('玖', new BigDecimal("9"));
// 定义基本单位
unitMap.put('拾', new BigDecimal("10"));
unitMap.put('佰', new BigDecimal("100"));
unitMap.put('仟', new BigDecimal("1000"));
// 定义高级单位
unitMap.put('万', new BigDecimal("10000"));
unitMap.put('亿', new BigDecimal("100000000"));
}
public static BigDecimal chineseCurrencyToNumber(String currency) {
BigDecimal total = BigDecimal.ZERO;
BigDecimal tempNum = BigDecimal.ZERO; // 存储当前临时的数字
BigDecimal section = BigDecimal.ZERO; // 当前小节的累加值,比如万以下,亿以下等
BigDecimal lastUnit = BigDecimal.ONE; // 上一个单位的值,默认为1
for (int i = 0; i < currency.length(); i++) {
char ch = currency.charAt(i);
// 判断当前字符是否为数字
if (numMap.containsKey(ch)) {
tempNum = numMap.get(ch);
} else if (unitMap.containsKey(ch)) {
BigDecimal unit = unitMap.get(ch);
if (unit.compareTo(new BigDecimal("10000")) < 0) {
section = section.add(tempNum.multiply(unit));
} else {
section = (section.add(tempNum)).multiply(unit);
total = total.add(section);
section = BigDecimal.ZERO; // 重置小节值
}
tempNum = BigDecimal.ZERO; // 重置临时数字
lastUnit = unit; // 更新最后的单位
}
}
// 确保最后没有单位的数字也被加上
total = total.add(section.add(tempNum));
return total;
}
public static void main(String[] args) {
String cnNum1 = "壹拾捌万元整";
String cnNum2 = "壹亿零壹拾捌万元整";
String cnNum3 = "伍亿伍仟零肆万伍仟元整";
BigDecimal result1 = chineseCurrencyToNumber(cnNum1);
BigDecimal result2 = chineseCurrencyToNumber(cnNum2);
BigDecimal result3 = chineseCurrencyToNumber(cnNum3);
System.out.println(result1);
System.out.println(result2);
System.out.println(result3);
}
}