刚学不久,现有一个关于把输入的中文数字如“一千二百三十四”转换成阿拉伯数字如“1234”的新手问题。
先说说自己的思路吧,可能有点笨。准备先把中文的字符串每个字符取出来放一字符数组里,如有“一”,“二”等数字,就用1,2等存在int变量中。再依次判断有无“千”或“百”,“十”等字符,如果有,再把前面一个位置上的数乘以相应的倍数,从高位到低位依次判断,就是用很多重的if来判断。但还是漏掉一些情况,如输入“百二三”这些不合法的数。且感觉逻辑上也不严密。请高人指点一下思路,或给个例子,小弟不甚感激。。谢谢先~~
先说说自己的思路吧,可能有点笨。准备先把中文的字符串每个字符取出来放一字符数组里,如有“一”,“二”等数字,就用1,2等存在int变量中。再依次判断有无“千”或“百”,“十”等字符,如果有,再把前面一个位置上的数乘以相应的倍数,从高位到低位依次判断,就是用很多重的if来判断。但还是漏掉一些情况,如输入“百二三”这些不合法的数。且感觉逻辑上也不严密。请高人指点一下思路,或给个例子,小弟不甚感激。。谢谢先~~
一千零二二千三百五十二 -----2352 四位全是数字
二千三百五十 -----2350 末尾有0
二千零五十二 -----2052 中间有0
两千零五四 -----2050中间末尾都有0
就这几中情况吧 如果不需验证中文数字的合法性应该简单吧
{一,二,三, .. 九} --a【】
{万 千 百。} -------b【】
从头解析中文数字的字符串
String b = "二千三百五十二";
int num=0;
int a=0;
int b=0
for(int i=0; i<len; ++i)
{
a = toNumInt(b[i]);自己写个函数把一换为1 二换成2 百对100 千对1000
if(a==0) //零对 0
{
break;
}
if(i !=len-2) //b【i】不是最后一位
{
b = toNumInt(b[i+1]);
num += a×b;
++i;
}
else
{
num += a;
}
}大概就是一个循环处理两位,以"二千三百五十二";
作位例子就是 先解析初2,然后解析出2后面的千 结果就是 2×1000
然后在for,就到了第3位 3了,3后面是个百 就是 3×100
类推注意的就是中间的零跳过,然后就是到没到结尾
所以倒着做,从字符串最后面开始读取,第一位需要判断一下,然后做一个数量级参数,初始化为1*万标志位*亿标志位,读到十就*10,读到百就*100,每用一次就复原。然后和紧接着读的数相乘,再累加即可。到万的时候万的标志为置10000,亿的时候标志位也转10000~~~,大致思路如此。
楼主的算法麻烦在于例如四万三千七百零三亿这样的数的时候第一位就一定要读到亿才能罢休。
int wan = 1;//万位标示
int yi = 1;//亿位标示
int flag = 1;//个,十,百,千的标示
long temp = 0;
String tmp = "";
long result = 0;
String[] c = new String[15];
public void init() {
c[0] = "零"; c[1] = "一"; c[2] = "二";
c[3] = "三"; c[4] = "四"; c[5] = "五";
c[6] = "六"; c[7] = "七"; c[8] = "八";
c[9] = "九"; c[10] = "十"; c[11] = "百";
c[12] = "千"; c[13] = "万"; c[14] = "亿";
}
// 判断数字,非法输入返回88
public int getCharNO(String readin) {
for (int i = 0; i < 15; i++) {
if (readin.equals(c[i])) {
return i;
}
}
return 88;
}
//中国人习惯,18就读十八,不读一十八,只好手动初始化,呵呵
public String formatInputSting(String s){
String fis="";
fis+=s.charAt(0);
if(fis.equals("十")){
return "一"+s;
}else{
return s;
}
} public long getResult(String s) {
s=formatInputSting(s);
for (int i = s.length() - 1; i >= 0; i--) {
tmp += s.charAt(i);
temp = caseop(tmp);
if (temp == -1) {
System.out.println("错误的参数输入");
return -1;
}
result += temp;
tmp = "";
}
return result;
} public long caseop(String s) {
long co = 0;
switch (getCharNO(s)) {
case 88:
return -1;
case 0:
return 0;
case 1:
co = 1 * flag * wan * yi;
flag = 1;
return co;
case 2:
co = 2 * flag * wan * yi;
flag = 1;
return co;
case 3:
co = 3 * flag * wan * yi;
flag = 1;
return co;
case 4:
co = 4 * flag * wan * yi;
flag = 1;
return co;
case 5:
co = 5 * flag * wan * yi;
flag = 1;
return co;
case 6:
co = 6 * flag * wan * yi;
flag = 1;
return co;
case 7:
co = 7 * flag * wan * yi;
flag = 1;
return co;
case 8:
co = 8 * flag * wan * yi;
flag = 1;
return co;
case 9:
co = 9 * flag * wan * yi;
flag = 1;
return co;
case 10:
flag = 10;
return 0;
case 11:
flag = 100;
return 0;
case 12:
flag = 1000;
return 0;
case 13:
wan = 10000;
return 0;
case 14:
yi = 10000;
wan = 10000;
return 0;
default:
return 0;
}
} public static void main(String[] args) {
TestString test = new TestString();
test.init();
System.out.print("十九亿八千七百零六万五千三百零一" +
test.getResult("十九亿八千七百零六万五千三百零一"));
}
}//错误输入判断没写,例如“百八十万”楼主自己补吧。
public String formatInputSting(String s) {
StringBuffer sb = new StringBuffer("");
for (int i = 0; i < s.length(); i++) {
if ('十' == (s.charAt(i))) {
if(i == 0)
{
sb.append("一");
sb.append(s.charAt(i));
}
else if('百' == (s.charAt(i - 1)) || '千' == (s.charAt(i - 1)) || '万' == (s.charAt(i - 1)) || '亿' == (s.charAt(i - 1)))
{
sb.append("一");
sb.append(s.charAt(i));
}
else
{
sb.append(s.charAt(i));
}
}
else
{
sb.append(s.charAt(i));
}
}
return sb.toString();
}
涨功力了~~,呵呵,加油啊
第二步:出数字:数字 X 单位 + 数字 X 单位+。 注意判断一下:如果有一个单位比前面出现的单位要大,就把前面的 (数字 X 单位 + 数字 X 单位+。)X 这个单位,如果没有单位,就直接加该数字。
例子:
四千万=(4*1000)*10000
四千万零一 = 四千万一 =(4*1000)*10000+1
四千万零十一 = 四千万一十一 = (4*1000)*10000+1*10+1
回figoren,是溢出了,下次改成String,呵呵
不过改下就可以了加一个判断 判断一下a,a如果是千 万之类的 就 让 num *= a;然后break; 也一样ok
“二千”我试过了没问题啊~~
对不起,是我弄错了,你的没问题,嘿嘿。。实在不好意思。