递归转化中文数字为阿拉伯数字 |
您所在的位置:网站首页 › 渐变国旗微信头像怎么搞的好看 › 递归转化中文数字为阿拉伯数字 |
觉得此处应造一轮,然后…… 最后结果只能求亿以下的汉字数字(确切地说,应该是不带亿和兆字,且不超过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的二分查找法。 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |