string str = "2+3-5*10"; 
怎么根据str得到-45这个值?

解决方案 »

  1.   


    int result = Convert.ToInt32(new DataTable().Compute(str,""));
      

  2.   

    string str = (2+3-5*10).ToString; 
      

  3.   

    最简单的方法:DataTable dt=new DataTable();
    object o = dt.Compute("2+3-5*10", null);
      

  4.   

    似乎需要写一个string型表达式的计算方法/// <summary>
      /// 算术逆波兰表达式计算.
      /// </summary>
      /// <param name="s"></param>
      /// <returns></returns>
      public static string ComputeRPN(string s)
      {
       
       string S=BuildingRPN(s);
       string tmp="";
       System.Collections.Stack sk=new System.Collections.Stack();
       char c=' ';
       System.Text.StringBuilder Operand=new System.Text.StringBuilder();
       double x,y;
       for(int i=0;i<S.Length;i++)
       {
        c=S[i];
        if(char.IsDigit(c)||c=='.')
        {//数据值收集.
         Operand.Append(c);
        }
        else if(c==' '&&Operand.Length>0)
        {
         #region 运算数转换
         try
         {
          tmp=Operand.ToString();
          if(tmp.StartsWith("-"))//负数的转换一定要小心...它不被直接支持.
          {//现在我的算法里这个分支可能永远不会被执行.
           sk.Push(-((double)Convert.ToDouble(tmp.Substring(1,tmp.Length-1))));
          }
          else
          {
           sk.Push(Convert.ToDouble(tmp));
          }
         }
         catch
         {
          return "发现异常数据值.";
         }
         Operand=new System.Text.StringBuilder();
         #endregion
        }
        else if(c=='+'//运算符处理.双目运算处理.
         ||c=='-'
         ||c=='*'
         ||c=='/'
         ||c=='%'
         ||c=='^')
        {
         #region 双目运算
         if(sk.Count>0)/*如果输入的表达式根本没有包含运算符.或是根本就是空串.这里的逻辑就有意义了.*/
         {
          y=(double)sk.Pop();
         }
         else
         {
          sk.Push(0);
          break;
         }
         if(sk.Count>0)
          x=(double)sk.Pop();
         else
         {
          sk.Push(y);
          break;
         }
         switch(c)
         {
          case '+':
           sk.Push(x+y);
           break;
          case '-':
           sk.Push(x-y);
           break;
          case '*':
           sk.Push(x*y);
           break;
          case '/':
           sk.Push(x/y);
           break;
          case '%':
           sk.Push(x%y);
           break;
          case '^':
    //       if(x>0)
    //       {我原本还想,如果被计算的数是负数,又要开真分数次方时如何处理的问题.后来我想还是算了吧.
            sk.Push(System.Math.Pow(x,y));
    //       }
    //       else
    //       {
    //        double t=y;
    //        string ts="";
    //        t=1/(2*t);
    //        ts=t.ToString();
    //        if(ts.ToUpper().LastIndexOf('E')>0)
    //        {
    //         ;
    //        }
    //       }
           break;
         }
         #endregion
        }
        else if(c=='!')//单目取反.)
        {
         sk.Push(-((double)sk.Pop()));
        }
       }
       if(sk.Count>1)
        return "运算没有完成.";
       if(sk.Count==0)
        return "结果丢失..";
       return sk.Pop().ToString();
      }
    这个可以代码参考下
      

  5.   

    int result = Convert.ToInt32(new DataTable().Compute(str, null));
      

  6.   

    http://www.codeproject.com/KB/cs/runtime_eval.aspx