本帖最后由 u013596294 于 2014-09-21 16:55:41 编辑

解决方案 »

  1.   

    可否将left 和 right 的定义 或者 数值贴出来看看呢
    还有将具体的异常信息贴出来,异常信息中会指出异常的原因
      

  2.   

    额~~ 我测试了一下没有问题呀  你能把left和right的定义都写出来吗
      

  3.   

    int  = i / 100;
                    int where = i % 100;
    String left = find_Left(s.substring(0,where - 1).toString());
    String right = find_Right(s.substring(where).toString());
    String temp = "";
    temp = String.valueOf(Double.parseDouble(left)*Double.parseDouble(right));
    temp = chuLing(temp);
      

  4.   

    int where = i % 100;
    String left = find_Left(s.substring(0,where - 1).toString());
    String right = find_Right(s.substring(where).toString());
    String temp = "";
    temp = String.valueOf(Double.parseDouble(left)*Double.parseDouble(right));我保证left、right是正确的 而且  Double.parseDouble(left)*Double.parseDouble(right)  这一步是能计算的(我断点调试试出来的),而且能计算正确
      

  5.   

    private int find_ChengAndChu(String s) {
    for (int i = 0; i < s.length(); i++)
    {
    char c = s.charAt(i);
    if (c == '*')
    return 100+i+1;
    else
    {
    if (c == '/')
    return 200+1+i;
    }
    }
    return 0;
    }

    private  int find_JiaAndJian(String s)
    {
    for (int i = 0; i < s.length(); i++)
    {
    char c = s.charAt(i);
    if (c == '+')
    return 300+i+1;
    else
    {
    if ((c == '-') && i != 0 && (s.charAt(i - 1) >= '0'&&s.charAt(i - 1) <= '9'))
    return 400+i+1;
    }
    }
    return 0;
    }

    private String find_Left(String s)
    {
    int n = 0;
    for (int i = s.length()-1; i >= 0; i--)
    {
    char c = s.charAt(i);
    if ((c >= '0'&&c <= '9')||c =='.' || i == 0)
    n++;
    else
    break;
    }
    return s.substring(s.length()-n);
    } private String find_Right(String s)
    {
    int n = 0;
    for (int i =0; i<s.length(); i++)
    {
    char c = s.charAt(i);
    if ((c >= '0'&&c <= '9') || c == '.'|| i ==0)
    n++;
    else
    break;
    }
    return s.substring(0,n);
    }

    private String  chuLing(String s)
    {
    if (Double.parseDouble(s) - Integer.parseInt(s) == 0)
    s = String.valueOf(Integer.parseInt(s));
    else
    {
    int n = 0;
    for (int i = s.length() - 1; i >= 0; i--)
    {
    char c = s.charAt(i);
    if (c == '0')
    n++;
    else
    break;
    }
    s = s.substring(0,s.length() - n).toString();
    }
    return s;
    }

    private String jiSuan(String s) {
    //if  处理括号问题
    if (s.indexOf(')') + 1 != 0)
    {
    //核心就是找出配对括号,将 字符串中“ (算式)”替换乘算式的结果
    //循环调用,最终变成一个无括号的字符串算式
    //最后再计算这个无括号的字符串算式,就能返回一个字符串类型的结果
    for (int right = s.indexOf(')') + 1 ; right > 0; )
    {
    int left = s.substring(0,right - 1).toString().lastIndexOf('(') + 1;
    String sLeft = s.substring(0,left - 1).toString();
    String sRight = s.substring(right);
    s = sLeft + jiSuan(s.substring(0,right - 1).toString().substring(left)) + sRight;
    }
    return jiSuan(s);
    }
    //  else 做四则运算
    else
    {
    //思路:先找到运算符,再找这个运算符的两个操作数
    // 计算,返回  “将原字符串中  此次运算的算式  替换为   运算结果”   的字符串

    //乘除运算
    for (int i = find_ChengAndChu(s);i>0 ;)
    {
    int  = i / 100;
    int where = i % 100;
    String left = find_Left(s.substring(0,where - 1).toString());
    String right = find_Right(s.substring(where).toString());
    String temp = "";
    if ( == 1)
    {
    temp = String.valueOf(Double.parseDouble(left)*Double.parseDouble(right));
    temp = chuLing(temp);
    }
    if ( == 2)
    {
    if(Double.parseDouble(right) == 0) {
    throw new ArithmeticException();
    }
    else {
    temp = String.valueOf(Double.parseDouble(left)/Double.parseDouble(right));
    temp = chuLing(temp);
    }
    }
    s = s.substring(0,where - left.length() - 1) + temp + s.substring(where + right.length());
    i = find_ChengAndChu(s);
    } //加减运算
    for (int i = find_JiaAndJian(s); i>0;)
    {
    int  = i / 100;
    int where = i % 100;
    String left = find_Left(s.substring(0,where - 1).toString());
    String right = find_Right(s.substring(where));
    String temp = "";
    if ( == 3)
    {
    temp = String.valueOf(Double.parseDouble(left) + Double.parseDouble(right));
    temp = chuLing(temp);
    }
    if ( == 4)
    {
    temp = String.valueOf(Double.parseDouble(left) - Double.parseDouble(right));
    temp = chuLing(temp);
    }
    s = s.substring(0,where - left.length() - 1) + temp + s.substring(where + right.length());
    i = find_JiaAndJian(s);
    }
    return s;
    }
    }
      

  6.   

    你是一个String乘以一个double啊
      

  7.   

    你是一个String乘以一个double啊不是啊,是两个double类型的数相乘 得到一个 “ N.0” 形式的数 当string。valueof是 抛异常
      

  8.   

    这个貌似只能是left或者right出问题转不了啊,
    或者两个值乘积比double类型上限还大