将大写金额(精确到圆)转换成数字

来源:互联网 发布:金融数据分析师助理 编辑:程序博客网 时间:2024/04/29 03:20

基本思路:
1、规范大写金额字符串
2、用正则匹配出每个段,包括亿段、万段、个段
3、遍历每个段的字符,用数字乘以单位并累加
4、用每个段的金额乘以每个段的单位并累加
目前这个算法只能匹配千万亿级以下的金额。

程序代码如下:

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);
}
}

原创粉丝点击