刚学不久,现有一个关于把输入的中文数字如“一千二百三十四”转换成阿拉伯数字如“1234”的新手问题。
先说说自己的思路吧,可能有点笨。准备先把中文的字符串每个字符取出来放一字符数组里,如有“一”,“二”等数字,就用1,2等存在int变量中。再依次判断有无“千”或“百”,“十”等字符,如果有,再把前面一个位置上的数乘以相应的倍数,从高位到低位依次判断,就是用很多重的if来判断。但还是漏掉一些情况,如输入“百二三”这些不合法的数。且感觉逻辑上也不严密。请高人指点一下思路,或给个例子,小弟不甚感激。。谢谢先~~

解决方案 »

  1.   

    http://blog.matrix.org.cn/page/ginger547?entry=%E6%80%8E%E6%A0%B7%E5%B0%86%E6%95%B0%E5%AD%97%E9%87%91%E9%A2%9D%E8%BD%AC%E6%8D%A2%E6%88%90%E4%B8%AD%E5%A4%96%E5%A4%A7%E5%86%99%E9%87%91%E9%A2%9D_java%E5%AE%9E%E7%8E%B0希望对你有用!
      

  2.   

    一千零二十一
    一千零二二千三百五十二  -----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
    类推注意的就是中间的零跳过,然后就是到没到结尾
      

  3.   

    把楼住的算法逆向思考一下就轻松了,因为中文表达是个,十,百,千,万,十万,百万,千万,亿,十亿,百亿,千亿,万亿,同时注意到中文除了十和个之间不读0之外都有零的存在,还是很方便大家的最后,万和亿再加个标志位初始为1就perfect了。
    所以倒着做,从字符串最后面开始读取,第一位需要判断一下,然后做一个数量级参数,初始化为1*万标志位*亿标志位,读到十就*10,读到百就*100,每用一次就复原。然后和紧接着读的数相乘,再累加即可。到万的时候万的标志为置10000,亿的时候标志位也转10000~~~,大致思路如此。
    楼主的算法麻烦在于例如四万三千七百零三亿这样的数的时候第一位就一定要读到亿才能罢休。
      

  4.   

    public class TestString {
        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("十九亿八千七百零六万五千三百零一"));
        }
    }//错误输入判断没写,例如“百八十万”楼主自己补吧。
      

  5.   

    wxg1008(嘻嘻哈哈) 算法不错 至于四万三千七百零三亿应该是溢出了
      

  6.   

    //change formatInputSting for '十' 
    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();
    }
      

  7.   

    wxg1008(嘻嘻哈哈) :
    涨功力了~~,呵呵,加油啊
      

  8.   

    http://blog.matrix.org.cn/page/ginger547?entry=%E6%80%8E%E6%A0%B7%E5%B0%86%E6%95%B0%E5%AD%97%E9%87%91%E9%A2%9D%E8%BD%AC%E6%8D%A2%E6%88%90%E4%B8%AD%E5%A4%96%E5%A4%A7%E5%86%99%E9%87%91%E9%A2%9D_java%E5%AE%9E%E7%8E%B0希望对你有用!
      

  9.   

    第一步:整理字符串:删除所有的'零',检查‘十’之前有没有数字,没有就加个一。
    第二步:出数字:数字 X 单位 + 数字 X 单位+。 注意判断一下:如果有一个单位比前面出现的单位要大,就把前面的 (数字 X 单位 + 数字 X 单位+。)X 这个单位,如果没有单位,就直接加该数字。
    例子:
    四千万=(4*1000)*10000
    四千万零一 = 四千万一 =(4*1000)*10000+1
    四千万零十一 = 四千万一十一 = (4*1000)*10000+1*10+1
      

  10.   

    补充一下:像楼主说的“百二三”这样的东西不是人话,凡是不符合:数字+单位+数字+单位+...+数字格式的,一律OUT!
      

  11.   

    回楼上的,三百万可是人话阿,数字+单位+单位
    回figoren,是溢出了,下次改成String,呵呵
      

  12.   

    wxg1008(嘻嘻哈哈) :没注意到百万千万的
    不过改下就可以了加一个判断 判断一下a,a如果是千  万之类的 就 让 num *= a;然后break; 也一样ok
      

  13.   

    欢迎光监点石成金网 http://www.boxigroup.com 网站提供web开发(j2ee .net asp php javascript、c#等) c/s开发(delphi、vb、vc、pb、cb等) 数据库开发(oracle、sqlserver、db2、access、mysql、Postgresql、informix)等学习资料,希望能为你解决燃眉之急 ,请把本网站加入收藏夹,以备不时查询之需 bs+cs讨论群(9638134)
      

  14.   

    谢谢楼上各位,wxg1008(嘻嘻哈哈)的程序挺好的。现在主要是如何设计输入合法性的问题,把各种输入错误都能判断出来。有没有哪位朋友 有较好的思路或例子共享一下,让我们新手学习学习。
      

  15.   

    to: wxg1008(嘻嘻哈哈)你的方法好像不能正确显示像“二千”这样的数。
      

  16.   

    chuanye20(浪翻云) 
    “二千”我试过了没问题啊~~
      

  17.   

    wxg1008(嘻嘻哈哈)
    对不起,是我弄错了,你的没问题,嘿嘿。。实在不好意思。
      

  18.   

    wxg1008(嘻嘻哈哈)如果输入的是"二千一",应该是"2100",但显示的是"2001";"三百二"应该是"320",只能显示"302"。请问这个问题怎么解决啊。。