java用递归将数字转换字符串_递归转化中文数字为阿拉伯数字

觉得此处应造一轮,然后……

最后结果只能求亿以下的汉字数字(确切地说,应该是不带亿和兆字,且不超过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的二分查找法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值