程序代码如下:
package zq.core;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class CMoneyToNum {
static Map<Character, Integer> numberMap = new HashMap<Character, Integer>();
static Map<Character, Integer> unitMap = new HashMap<Character, Integer>();
static {
numberMap.put('一', 1);
numberMap.put('二', 2);
numberMap.put('三', 3);
numberMap.put('四', 4);
numberMap.put('五', 5);
numberMap.put('六', 6);
numberMap.put('七', 7);
numberMap.put('八', 8);
numberMap.put('九', 9);
numberMap.put('壹', 1);
numberMap.put('贰', 2);
numberMap.put('叁', 3);
numberMap.put('肆', 4);
numberMap.put('伍', 5);
numberMap.put('陆', 6);
numberMap.put('柒', 7);
numberMap.put('捌', 8);
numberMap.put('玖', 9);
unitMap.put('亿', 100000000);
unitMap.put('万', 10000);
unitMap.put('千', 1000);
unitMap.put('仟', 1000);
unitMap.put('佰', 100);
unitMap.put('百', 100);
unitMap.put('拾', 10);
unitMap.put('十', 10);
}
public long chineseToNumber(String cMoney) {
cMoney = cMoney.replaceAll("零|元|圆|整", "");
long result = 0;
Pattern p = Pattern.compile("([^亿万]+)([亿万]?)");
Matcher m = p.matcher(cMoney);
int start = 0;
while (m.find(start)) {
String partOfCMoney = m.group(1);
int unit = 1;
try {
unit = unitMap.get(m.group(2).charAt(0));
} catch (IndexOutOfBoundsException e) {
}
long partOfMoney = 0;
char[] cArray = partOfCMoney.toCharArray();
for (int i = 1; i < partOfCMoney.length(); i += 2) {
Integer n = numberMap.get(cArray[i-1]);
Integer u = unitMap.get(cArray[i]);
partOfMoney += (long) n * u;
}
if (cArray.length % 2 == 1) {
partOfMoney += numberMap.get(cArray[cArray.length - 1]);
}
result += (long) (partOfMoney * unit);
start = m.end();
}
return result;
}
}
测试代码如下:
package zq.test;
import static org.junit.Assert.assertEquals;
import org.junit.BeforeClass;
import org.junit.Test;
import zq.core.CMoneyToNum;
public class CMoneyToNumTest {
private static CMoneyToNum c2n;
@BeforeClass
public static void init() {
c2n = new CMoneyToNum();
}
@Test
public void test1() {
String cMoney = "一仟贰佰三十肆亿伍仟六百七十八万九千一百二拾叁元整";
long number = c2n.chineseToNumber(cMoney);
assertEquals(123456789123L, number);
}
@Test
public void test2() {
String cMoney = "壹仟零二拾亿零三百零肆";
long number = c2n.chineseToNumber(cMoney);
assertEquals(102000000304L, number);
}
@Test
public void test3() {
String cMoney = "壹仟二佰万元";
long number = c2n.chineseToNumber(cMoney);
assertEquals(12000000, number);
}
@Test
public void test4() {
String cMoney = "四佰圆整";
long number = c2n.chineseToNumber(cMoney);
assertEquals(400, number);
}
@Test
public void test5() {
String cMoney = "一圆";
long number = c2n.chineseToNumber(cMoney);
assertEquals(1, number);
}
}