觉得此处应造一轮,然后……
最后结果只能求亿以下的汉字数字(确切地说,应该是不带亿和兆字,且不超过java整型范围的汉字数字)。我觉得还不错~
/*
* paramter end should be a valid index in the String.
* calculate a Chinese Number that is less that 1*10^8 (九千九百九十九万九千九百九十九). to extend to 亿 and 兆, one have to wrap this method and introduce more complex condition judgments.
*but actually you can represent 1亿 by using some unusual notations such as '一万万' and my algorithm still recognize it well.
*/
private static int recurse1wCalc(String in,int start,int end,int CurrentLvMPlyer) {
int _CurrentLvMultiplyer=CurrentLvMPlyer;
int _CurrentLv=0;
int ret=0;
while(end>=start) {
String levelCharacter = in.substring(end, end+1);
int res=reduce(levelCharacter,0,11);
if(res==-1) {//是数位符
int neoLv=0;
if(levelCharacter.equals("十")) {
neoLv=1;
}else if(levelCharacter.equals("百")) {
neoLv=2;
}else if(levelCharacter.equals("千")) {
neoLv=3;
}else {//if(levelCharacter.equals("万")) {
neoLv=4;
}
if(end==start&&neoLv==1) {//十几
_CurrentLvMultiplyer=_CurrentLvMultiplyer*Levels[neoLv];
return 1*_CurrentLvMultiplyer+ret;
}else if(neoLv>_CurrentLv) {//正常
_CurrentLvMultiplyer=CurrentLvMPlyer*Levels[neoLv];
_CurrentLv=neoLv;
}else {//递归求前置修饰数
return recurse1wCalc(in,start,end,1)*_CurrentLvMultiplyer+ret;
}
}else {//是数符
ret+=Numbers[res]*_CurrentLvMultiplyer;
}
end--;
}
return ret;
}
static final String[] numOrder = {"一","七","三","两","九","二","五","八","六","四","零"};
static final int[] Numbers = {1,7,3,2,9,2,5,8,6,4,0};
static final int[] Levels = {1,10,100,1000,10000};
public static int reduce(String phrase,int start,int end) {//via mdict-js
int len = end-start;
if (len > 1) {
len = len >> 1;
return phrase.compareTo(numOrder[start + len - 1])>0
? reduce(phrase,start+len,end)
: reduce(phrase,start,start+len);
} else {
return phrase.compareTo(numOrder[start])==0?start:-1;
}
}
顺便又用了mdict-js里面找到的叫做reduce的二分查找法。