经过将上一个中文数字转换换成阿拉伯数字的改进,已经可以支持上亿转换,其实无非也就是在上一个程序上面加了很多判断….也没有太多的算法什么的可言…但也让我挠了好久的头…下面是修改了的程序,可以看看,拿出来测测,也欢迎各位评论,哪里有BUG。谢谢
public static void main(String[] args) {
Map<Character, String> numberMap = new HashMap<Character, String>();
numberMap.put('零', "0");
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");
Map<Character, String> numberBit = new HashMap<Character, String>();
numberBit.put('十', "10");
numberBit.put('百', "100");
numberBit.put('千', "1000");
numberBit.put('万', "10000");
numberBit.put('亿', "100000000");
/**
* 思路:
* 将中文数字字符串变成字符数组,以亿和万为分割点,分割字符数组,并组合成字符串存入numberList集合中
* 举例:"一万二千三百四十五亿六千七百八十九万" 分割成["一万二千三百四十五亿"],["六千七百八十九万"]并存入numberList集合中,此时集合有两个元素。
* 循环numberList集合,在该循环体内在套一层循环来遍历字符数组并按下面的思路计算出对应的值,将numberList集合里面计算出来的其他值相加,得出结果;
* 也就是["一万二千三百四十五亿"]+["六千七百八十九万"]=1234500000000+67890000=1234567890000
* 求值思路:循环遍历数字字符数组
* 举例:
* 九 把numberMap的key为九取出, 即9
* 九十 把numberMap的key为九取出并乘以numberBit的key为十的值,即9*10=90
* 九十一 把numberMap的key为九取出并乘以numberBit的key为十的值,然后加上numberMap的key为一 的值,即9*10+1=91
* 十一 同上10+1=11
* 一百万 先取出numberMap为一的key的值,然后乘以numberBit的key为百的值,然后乘以numberBit的key为万的值,即1*100*10000=1000000
* 一百八十八万 1*100+(8*10+8)*10000=100+88*10000=1880000
*
*
*
*
*/
long number = 0;
String chinaNumberStr = "二十三万一千一百三十八亿";
char[] arrNumber = chinaNumberStr.toCharArray();
List<String> numberList = new ArrayList<String>();
for (int i = 0; i < arrNumber.length; i++) {
boolean result = true;
String strNum="";
while(result){
char num = arrNumber[i];
if(numberMap.containsKey(num)||
numberBit.containsKey(num)&&Integer.parseInt(numberBit.get(num))<Integer.parseInt(numberBit.get('万'))){
if(++i==arrNumber.length){
result=false;
}
strNum+=num;
}else{
int yiIndex = -1;
if ((yiIndex = chinaNumberStr.indexOf("亿")) != -1 && i <= yiIndex) {
strNum+=chinaNumberStr.subSequence(i, yiIndex+1);
i=i+yiIndex-i;
}else{
strNum+=num;
}
result = false;
}
}
numberList.add(strNum);
}
System.out.println(numberList);
for (String str : numberList) {
arrNumber = str.toCharArray();
long num = 0;
for (int i = 0; i < arrNumber.length; i++) {
char numStr = arrNumber[i];
if (numStr == '十' && i == 0) {//“十”特殊处理 当出现十八之类的 十在前面的情况
num = Integer.parseInt(numberBit.get('十'));
}else if (i + 1 < arrNumber.length && numberBit.containsKey(arrNumber[i + 1])) {// 判断后面的汉字是否是位数(十百千万)
if (numberMap.containsKey(numStr)) {// 如果当前的汉字不是位数
if(i + 3 < arrNumber.length&&arrNumber[i + 1]=='十'&&numberMap.containsKey(arrNumber[i + 2])){
num = num + Integer.parseInt(numberMap.get(numStr))* Integer.parseInt(numberBit.get(arrNumber[i + 1]));
num = num + Integer.parseInt(numberMap.get(arrNumber[i + 2]));
num = num * Integer.parseInt(numberBit.get(arrNumber[i + 3]));
i=i+2;
}else if(i + 2 < arrNumber.length&&i!=0&&arrNumber[i-1]=='十'&&numberMap.containsKey(arrNumber[i])){
num = num + Integer.parseInt(numberMap.get(arrNumber[i]));
num = num * Integer.parseInt(numberBit.get(arrNumber[i + 1]));
//i=i+1;
}else{// 取出当前对应的数字*位数对应倍数累加在number上
num = num + Integer.parseInt(numberMap.get(numStr))* Integer.parseInt(numberBit.get(arrNumber[i + 1]));
}
} else if (numberBit.containsKey(numStr)) {// 如果当前的汉字是位数,即当前的汉字和后一个汉字都是位数(比如百万)
//则用number直接*后一个位数
num = num * Integer.parseInt(numberBit.get(arrNumber[i + 1]));
}
} else if (numberMap.containsKey(numStr)) {
num = num + Integer.parseInt(numberMap.get(numStr));
}
}
number+=num;
}
System.out.println(number);
}
Alvin_先森