就是能把  string str="1+2*(3+4)-5";
这种字符串用C#中以有的方法 变成数学表达式计算出结果!

解决方案 »

  1.   

    看看这个文章吧
    http://dev.csdn.net/develop/article/59/59512.shtm
      

  2.   

    两种方案,一利用脚本引擎、二利用数据表格DataTable()
    //先在项目中添加COM引用Microsoft Script Control 1.0
    using MSScriptControl;ScriptControl vScriptControl = new ScriptControl();
    vScriptControl.Language = "JavaScript";
    Text = vScriptControl.Eval("'Zswang 路过' + (1 + 2)").ToString();
    public static object Eval(string AExpression)
    {
        try
        {
            return new DataTable().Compute(AExpression, "");
        }
        catch
        {
            return null;
        }
    }
      

  3.   

    难!C#是编译语言, 不是解释性语言。你可以试试用CodeDom生成临时的代码, 然后运行取得结果。完整的方案是写一个解释器,不过明显不是“急求”的答案。比如这个CodeProject的链接(我没有试过他的代码):
    http://www.codeproject.com/KB/dotnet/Expr.aspx
      

  4.   


    带括号的计算(表达式)
    {
      if(有括号)
        {
          带括号的计算(表达式.replace(最外层括号内容,带括号的计算(最外层括号内容)))
        }
      else
      {
        不带括号的计算(表达式)
      }
    }不带括号的计算(表达式)
    {
      if(有乘除)
      {
        不带括号的计算(表达式.replace(乘除号及两侧的数,乘除法(乘除号及两侧的数)))
      }
      else
      {
        依次做加减法
      }
    }乘除法(表达式)
    {
      左边的数 乘或除 右边的数
    }以上是递归版本,非递归的版本可以参考数据结构的逆波兰表达式。
      

  5.   

    public static object Eval(string expression)
        {        string className = "Calc";        string methodName = "Run";        expression = expression.Replace("/", "*1.0/");         //     创建编译器实例。              ICodeCompiler complier = (new CSharpCodeProvider().CreateCompiler());        //     设置编译参数。              CompilerParameters paras = new CompilerParameters();        paras.GenerateExecutable = false;        paras.GenerateInMemory = true;
             //     创建动态代码。              StringBuilder classSource = new StringBuilder();        classSource.Append("public     class     " + className + "\n");        classSource.Append("{\n");        classSource.Append("                 public     object     " + methodName + "()\n");        classSource.Append("                 {\n");        classSource.Append("                                 return     " + expression + ";\n");        classSource.Append("                 }\n");        classSource.Append("}");        //System.Diagnostics.Debug.WriteLine(classSource.ToString());              //     编译代码。              CompilerResults result = complier.CompileAssemblyFromSource(paras, classSource.ToString());        //     获取编译后的程序集。              Assembly assembly = result.CompiledAssembly;        //     动态调用方法。              object eval = assembly.CreateInstance(className);        MethodInfo method = eval.GetType().GetMethod(methodName);        object reobj = method.Invoke(eval, null);        GC.Collect();        return reobj;    }
     //=============================//使用Method:      
     int intValue = (int)Eval(“3*5+8”); 
    涉及技術方面:   動態編譯程序集
       程序集動態生成Instance
        Reflection機制
      

  6.   

    //在引用中添加com中的microsoft   script   control   1.0   using MSScriptControl;MSScriptControl.ScriptControl sc = new MSScriptControl.ScriptControlClass();
            sc.Language = "javascript";
           Response.Write (sc.Eval("6+9-9*8").ToString());  
      

  7.   

    谢谢大家的帮忙  首先谢谢3楼的方法   我一开始是找到了引用  但是不会用  谢谢了  现在会用了DataTable 那个方法是我喜欢的   现成的要比我自己写的那个有效率吧?  我想应该是这样的  因为我还是初学者  写的垃圾了很多谢谢5楼的逻辑   看你的逻辑之前 我已经自己常识着写出了一套可以计算字符串表达试的方法了   一会我会把代码粘上  大家分享下  顺便哪里有不好的  希望大家指教一下下面是我自己用2005写的一个控制台应用程序  简单的实现了一下   大家帮忙指点一下
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Collections;namespace MakeString
    {
        class Program
        {
            static void Main(string[] args)
            {
                System.Console.WriteLine("请输入要计算的字符串");
                string str = System.Console.ReadLine();
                make(str);
            }        public static void make(string str)
            {
                do
                {
                    int one = 0;
                    int oneend = 0;
                    int biao = 0;
                    foreach (char c in str)
                    {
                        if (c == '(')
                        {
                            one = biao;
                        }
                        if (c == ')')
                        {
                            oneend = biao;
                        }
                        biao++;
                        if (oneend != 0)
                        {
                            break;
                        }
                    }
                    if (one == 0 || oneend == 0)
                    {
                        break;
                    }
                    str=str.Replace(str.Substring(one, oneend - one+1),doEach(str.Substring(one + 1, oneend - one-1)));
                } while (true);
                Console.WriteLine("结果是:{0}",doEach(str)); 
            }
            public static string doEach(string st)
            {
                ArrayList num = new ArrayList();
                ArrayList fh = new ArrayList();
                int begin = 0;
                foreach (char c in st)
                {                if (c == '+')
                    {
                        num.Add(double.Parse(st.Substring(begin, st.IndexOf('+'))));
                        st = st.Remove(begin, st.IndexOf('+'));
                        fh.Add(st.Substring(begin, 1));
                        st = st.Remove(begin, 1);
                    }
                    else if (c == '-')
                    {
                        num.Add(double.Parse(st.Substring(begin, st.IndexOf('-'))));
                        st = st.Remove(begin, st.IndexOf('-'));
                        fh.Add(st.Substring(begin, 1));
                        st = st.Remove(begin, 1);
                    }
                    else if (c == '*')
                    {
                        num.Add(double.Parse(st.Substring(begin, st.IndexOf('*'))));
                        st = st.Remove(begin, st.IndexOf('*'));
                        fh.Add(st.Substring(begin, 1));
                        st = st.Remove(begin, 1);
                    }
                    else if (c == '/')
                    {
                        num.Add(double.Parse(st.Substring(begin, st.IndexOf('/'))));
                        st = st.Remove(begin, st.IndexOf('/'));
                        fh.Add(st.Substring(begin, 1));
                        st = st.Remove(begin, 1);
                    }
                    else if (c == '%')
                    {
                        num.Add(double.Parse(st.Substring(begin, st.IndexOf('%'))));
                        st = st.Remove(begin, st.IndexOf('%'));
                        fh.Add(st.Substring(begin, 1));
                        st = st.Remove(begin, 1);
                    }
                }
                num.Add(double.Parse(st.Substring(begin, st.Length)));
                do
                {
                    for (int i = 0; i < fh.Count; i++)
                    {
                        if (fh[i].ToString() == "*")
                        {
                            num[i] = double.Parse(num[i].ToString()) * double.Parse(num[i + 1].ToString());
                            num.Remove(num[i + 1]);
                            fh.Remove(fh[i]);
                        }
                        else if (fh[i].ToString() == "/")
                        {
                            num[i] = double.Parse(num[i].ToString()) / double.Parse(num[i + 1].ToString());
                            num.Remove(num[i + 1]);
                            fh.Remove(fh[i]);
                        }
                        else if (fh[i].ToString() == "%")
                        {
                            num[i] = double.Parse(num[i].ToString()) % double.Parse(num[i + 1].ToString());
                            num.Remove(num[i + 1]);
                            fh.Remove(fh[i]);
                        }
                        if (fh.Count == 0)
                        {
                            break;
                        }
                    }
                    for (int i = 0; i < fh.Count; i++)
                    {
                        if (fh[i].ToString() == "+")
                        {
                            num[i] = double.Parse(num[i].ToString()) + double.Parse(num[i + 1].ToString());
                            num.Remove(num[i + 1]);
                            fh.Remove(fh[i]);
                        }
                        else if (fh[i].ToString() == "-")
                        {
                            num[i] = double.Parse(num[i].ToString()) - double.Parse(num[i + 1].ToString());
                            num.Remove(num[i + 1]);
                            fh.Remove(fh[i]);
                        }
                    }
                    if (fh.Count == 0)
                    {
                        break;
                    }
                } while (true);
                
                return num[0].ToString();
            }
        }
    }