如题:如果表达式中还包含 括号,又怎么办?

解决方案 »

  1.   

    放在SQL中没问题
            DECLARE @SQL NVARCHAR(4000)        SET @SQL=REPLACE(@RATE_DESC,'含税销售额',CAST(@PRICE*@QTY  AS NVARCHAR(4000)))        SET @SQL=REPLACE(@SQL,'差价',cast(cast(cast(@DIFF_PRICE as decimal(20,4))  as decimal(20,4)) as varchar(4000)))--cast(as varchar(4000)))
            SET @SQL=REPLACE(@SQL,'数量',cast(cast(@QTY as decimal(20,4)) as varchar(4000)))
            SET @SQL=REPLACE(@SQL,'价格',cast(cast(@PRICE as decimal(20,4)) as varchar(4000)))
            SET @SQL=REPLACE(@SQL,'汇率',cast(cast(@CUR_RATE as decimal(20,4)) as varchar(4000)))
            SET @SQL=REPLACE(@SQL,'不含税销售额',cast(cast((@PRICE*@QTY/(1+@TAX_RATE))  as decimal(20,4)) as varchar(4000)))
            SET @SQL=REPLACE(@SQL,'销售额',CAST(@PRICE*@QTY  AS NVARCHAR(4000)))
            SET @SQL=REPLACE(@SQL,'税率',cast(cast(@TAX_RATE as decimal(20,4)) as varchar(4000)))
            SET @RATE_DESC=('SELECT @RAKE1='+@SQL)
            DECLARE @RAKE NVARCHAR(4000)
            exec sp_executesql @RATE_DESC,N'@RAKE1  nvarchar(4000) output',@RAKE OUTPUT
            SET @RAKE_OFF=CAST(@RAKE AS MONEY)/@QTY --回扣
      

  2.   

    cansum396(沉觉不醒)误会我意思了:我是指,任意写一个 可计算的 字符串表达式,如: 1+2*3-4  结果: 3
        (1+2)*3-4 结果:5
        (10-6)/2 + 2 结果:4
        ...怎么写一段代码 能计算出它的结果
      

  3.   

    简单,用 eval 函数  ^_^  javascript等很多脚本语言都自带了类似的函数,直接计算字符串作为表达式的结果
      

  4.   

    http://www.csdn.net/develop/article/26/26383.shtm
      

  5.   

    string al="1+2*3-4";
    Microsoft.JScript.Vsa.VsaEngine vsa = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
    string sum = Microsoft.JScript.Eval.JScriptEvaluate(al,vsa).ToString();
    Response.Write(sum);
    //输入3
      

  6.   

    有3种方法:
    1。把此表达式封装成SQL语句,提交给SQLSERVER 处理
    2。把此表达式提交给EXCEL处理
    3。在www.codeproject.com 搜索 expression 关键字,就可以找到老外写好了的一个处理类
    我现在就用这个类来计算字符串表达式的
    但是你前提必须保证此字符串的语法正确性,所以我就在SQLSERVER里验证其语法性
    你试试吧
      

  7.   

    记得要添加下面2个引用
    Microsoft.JScript.Vsa
    Microsoft.JScript.Eval
      

  8.   

    using System;
    using System.CodeDom.Compiler;
    using Microsoft.CSharp;
    using System.Reflection;
    using System.Text;
    namespace ScreenBot
    {
    /// <summary>
    /// Calc 的摘要说明。
    /// </summary>
    public class calculate
    {
    public  static  object  Calc(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;
    } }}
    调用Calc("1+2*3-4");
      

  9.   

    我以前写过一个计算简单4则运算表达式的函数, 用的是算符优先级算法, 给你好了/// <summary>
    /// 计算表达式
    /// </summary>
    /// <param name="expression">四则运算表达式字符串</param>
    /// <returns>计算结果</returns>
    public static double EvaluateExpression(string expression)
    {
    string op = "+-*/()#";
    Stack optr = new Stack();
    Stack opnd = new Stack(); int e = 1000; //运算符间的关系,顺序为 +, -, *, /, (, ), #
    int[,] precede = new int[,]{
    { 1,  1, -1, -1, -1, 1, 1},
    { 1,  1, -1, -1, -1, 1, 1},
    { 1,  1,  1,  1, -1, 1, 1},
    { 1,  1,  1,  1, -1, 1, 1},
    {-1, -1, -1, -1, -1, 0, 1},
    { 1,  1,  1,  1,  e, 1, 1},
    {-1, -1, -1, -1, -1, e, 0}};
    string expr = expression.Replace(" ", "");
    expr = expr + "#";
    optr.Push("#");
    int index = 0;
    char c = expr[index++];
    char x, theta;
    double opnd1 = 0, opnd2 = 0;
    while(c != '#' || Convert.ToChar(optr.Peek()) != '#')
    {
    if(Char.IsDigit(c)) //不是运算符则进栈
    {
    string num = "";
    do
    {
    num += c;
    }while(Char.IsDigit(c = expr[index++]));
    opnd.Push(Convert.ToDouble(num));
    }
    else
    {
    switch(precede[op.IndexOf(Convert.ToChar(optr.Peek())), op.IndexOf(c)])
    {
    case -1:
    optr.Push(c);
    c = expr[index++];
    break;
    case 0:
    x = Convert.ToChar(optr.Pop());
    c = expr[index++];
    break;
    case 1:
    theta = Convert.ToChar(optr.Pop());
    opnd2 = Convert.ToDouble(opnd.Pop());
    opnd1 = Convert.ToDouble(opnd.Pop());
    switch(theta)
    {
    case '+':
    opnd.Push(opnd1 + opnd2);
    break;
    case '-':
    opnd.Push(opnd1 - opnd2);
    break;
    case '*':
    opnd.Push(opnd1 * opnd2);
    break;
    case '/':
    opnd.Push(opnd1 / opnd2);
    break;
    }
    break;
    default:
    throw new Exception("错误的表达式“" + expression + "”!");
    }
    }
    } return Convert.ToDouble(opnd.Peek());}
      

  10.   

    基本算法题目,如果想偷懒就直接用JScript的Eval方法好了……。