c#中怎么把字符串转化为数学表达式?比如“3+233”-------3+233

解决方案 »

  1.   


    如果你要结果 可以使用table DataTable _ComputeTable = new DataTable();object _Value = _ComputeTable.Compute("3+222", null);MessageBox.Show(_Value.ToString());
      

  2.   

    先正则解析,然后 把解出的string 转化int 比如用Convert.XXX();或 int.Parse(string s); 等
      

  3.   

    似乎Dijkstra有一个分解算法,但要使用栈
      

  4.   

    我也是这个思路!不知道怎么用呀!['a']+['b']这样写的!怎么解析为a.exp+b.exp
      

  5.   

    javascript中可以使用eval("表达式")
      

  6.   

    用动态编译给你一个方法:   public static object Calculate(string expression)
            {
                string className = "Calc";
                string methodName = "Run";
                expression = expression.Replace("/", "*1.0/");            //创建编译器实例。       
                ICodeCompiler complier = (new CSharpCodeProvider().CreateCompiler());            //CodeDomProvider complier = CodeDomProvider.CreateProvider(System.Threading.Thread.CurrentThread.CurrentCulture.Name);            //设置编译参数。       
                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;
            }传入表达式就可以计算了。
      

  7.   

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    namespace Exame
    {
        //表达式节点,
        //其中Exp可以表示为对其他节点的引用,格式为['NodeName']的形式,比如['a']+['b']表示 Name=="a"的节点的值 “加上” Name="b"的节点的值
        public struct ExpNode
        {
            public string Name;  //名称
            public string Exp;  //表达式:可以为直接量:比如:12,30.0.也可能为表达式:['a']+['b'].
            public ExpNode(string name, string exp)
            {
                this.Name = name;
                this.Exp = exp;
            }
            public override string ToString()
            {
                return Name;
            }
        } 
       
        class Program
        {
            static void Main(string[] args)
            {
                ExpNode[] nodes = new ExpNode[]
                {
                    new ExpNode("a","['b']+['c']"),
                    new ExpNode("b","['e']-['c']"),
                    new ExpNode("c","['e']+['d']"),
                    new ExpNode("d","10"),
                    new ExpNode("e","['d']+2")
                };            /*在这里写出排序算法,对Nodes(按照计算的先后顺序)进行排序,得出计算的先后顺序。并且通过Console输出:
                正确的结果是: d e c b a             * 
                 * 假定:表达式不会循环引用。
                */
                foreach (ExpNode n in nodes)
                    Console.Write(n);
            }
        }
      

  8.   


    string Precede(string p, string q){
    switch(p){
    case "+":
    case "-":return ("*/(".IndexOf(q)!=-1)?"<":">";
    case "*":
    case "/":return (q=="(")?"<":">";
    case "(":return (q==")")?"=":"<";
    case ")":return (q=="(")?"?":">";
    case "#":return (q=="#")?"=":"<";
    }
    return "?";
    }
    Double Operate(Double a,char o,Double b)
    {
    switch(o)
    {
    case '+':return a+b;
    case '-':return a-b;
    case '*':return a*b;
    case '/':return a/b;
    }
    return 0;
    }Object qswhEval1(string Expression){
    /*************(qiushuiwuhen 2002-12-14)****************/
    Stack nArr=new Stack(),oArr=new Stack();
    int j=0;
    Double a=0,b=0;
    string w="";
    char o;
    MatchCollection arr=Regex.Matches(Expression.Replace(" ","")+"#",@"(((?<=(^|\())-)?\d+(\.\d+)?|\D)");oArr.Push('#');
    w=Convert.ToString(arr[j++]);
    while(!(w=="#"&&Convert.ToString(oArr.Peek())=="#")){
    if("+-*/()#".IndexOf(w)!=-1){
    switch(Precede(oArr.Peek().ToString(),w)){
    case "<":
    oArr.Push(w);
    w=Convert.ToString(arr[j++]);
    break;
    case "=":
    oArr.Pop();
    w=Convert.ToString(arr[j++]);
    break;
    case ">":
    o=Convert.ToChar(oArr.Pop());
    b=Convert.ToDouble(nArr.Pop());
    a=Convert.ToDouble(nArr.Pop());
    nArr.Push(Operate(a,o,b));
    break;
    default:
    return "Error";
    break;}
    }else{
    nArr.Push(w);
    w=Convert.ToString(arr[j++]);
    }
    }
    return nArr.Pop();
    }
      

  9.   

    写个C#的eval类,然后调用就行了
      

  10.   

      string str = "3+233";
      String[] mystr = str.Split('+');
      int myint =int.Parse (mystr[0]) + int.Parse (mystr[1]);