如题:如果表达式中还包含 括号,又怎么办?
解决方案 »
- 关于WPF窗体焦点的问题~!~!
- 小妹请教XML删除节点问题
- 自定义 Textbox?
- System.Array的问题,很急!!!!! 帮兄弟一个忙!!!!
- 【菜鸟求助】如何在前台写UPDATE
- 请问在C#中怎么实现得到字符串1在字符串2中的位置??多谢!!
- 在.net下能否使用以前的ocx控件,如何使用。谁有在.net下能够使用的电子地图处理控件,谢谢
- 一个小问题
- 请问各位,在哪里可以下载vs.net?
- 两个按钮打开同一窗体,返回不同值写法
- 本人自学了一点C#和ASP.NET却苦于无头无序,对知识虽有少许认识,但仍未入门,请各位大哥指点迷津,谢谢!
- 访问http://www.163.com这样的url,除了在浏览器上打开,还有什么办法?
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 --回扣
(1+2)*3-4 结果:5
(10-6)/2 + 2 结果:4
...怎么写一段代码 能计算出它的结果
Microsoft.JScript.Vsa.VsaEngine vsa = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
string sum = Microsoft.JScript.Eval.JScriptEvaluate(al,vsa).ToString();
Response.Write(sum);
//输入3
1。把此表达式封装成SQL语句,提交给SQLSERVER 处理
2。把此表达式提交给EXCEL处理
3。在www.codeproject.com 搜索 expression 关键字,就可以找到老外写好了的一个处理类
我现在就用这个类来计算字符串表达式的
但是你前提必须保证此字符串的语法正确性,所以我就在SQLSERVER里验证其语法性
你试试吧
Microsoft.JScript.Vsa
Microsoft.JScript.Eval
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");
/// 计算表达式
/// </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());}