计算公式问题
我现在有一个公式是字符串类型:“(2+3)/4-1”,我想求的计算结果
是不是一定要按运算符分解开转化成相应的类型,才可以啊?
有没有方便一点的办法啊?
问题点数:50、回复次数:9Top
1 楼LixingTie(生铁)回复于 2006-03-13 11:51:01 得分 5
本人收集了一个类,是用来计算字符串格式的表达式的。
using System;
using System.CodeDom.Compiler;
using System.Reflection;
using System.Text;
using Microsoft.CSharp;
namespace Expression
{
/// <summary>
/// 计算表达式的类
/// </summary>
public class CalculateExpression
{
/// <summary>
/// 接受一个string类型的表达式并计算结果,返回一个object对象,静态方法
/// </summary>
/// <param name="expression"></param>
/// <returns></returns>
public static object Calculate(string expression)
{
string className = "Calc";
string methodName = "Run";
expression = expression.Replace("/", "*1.0/");
// 创建编译器实例。
CodeDomProvider complier = (new Microsoft.CSharp.CSharpCodeProvider());
// 设置编译参数。
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("}");
// 编译代码。
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;
}
}
}Top
2 楼hyena041(陷入自己的思维中,找不到自己了)回复于 2006-03-13 11:56:55 得分 5
赞一下,2楼的东西,收藏了
呵呵Top
3 楼LixingTie(生铁)回复于 2006-03-13 11:59:28 得分 0
该类的Calculate方法接收一个string字符串,通过编译器编译计算出结果,返回一个object值。楼主的问题只要调用该类的Calculate方法把字符串传进去就可以了。
string str = "(2+3)/4-1";
double result;
result = (double) Expression.CalculateExpression.Calcualte(str);
该类也可以计算其它类型的表达式。例如调用方法传进字符串"3>2",则返回true;Top
4 楼LixingTie(生铁)回复于 2006-03-13 12:01:26 得分 0
顺便说一句,这个类的代码是C#2.0环境下的,用VS2003运行可能会报错,建议用VS2005Top
5 楼piaoyu581(欣欣我心)回复于 2006-03-13 12:10:21 得分 0
谢二楼的了~~不过我的项目是VS2003的~~~
先试下再说~Top
6 楼piaoyu581(欣欣我心)回复于 2006-03-13 12:14:17 得分 0
汗。。。1.1框架CodeDomProvider好象不包含对CompileAssemblyFromSource的定义哦Top
7 楼Montaque(每天回答两个问题)回复于 2006-03-13 12:19:55 得分 5
http://montaque.cnblogs.com/archive/2005/12/28/306407.htmlTop
8 楼LixingTie(生铁)回复于 2006-03-13 12:46:56 得分 35
吼吼~~~~~应各位要求,改了一下,下面是.Net framework 1.1版本的,感谢各位的支持!!
using System;
using System.CodeDom.Compiler;
using System.Reflection;
using System.Text;
using Microsoft.CSharp;
namespace Expression
{
/// <summary>
/// 计算表达式的类
/// </summary>
public class CalculateExpression
{
/// <summary>
/// 接受一个string类型的表达式并计算结果,返回一个object对象,静态方法
/// </summary>
/// <param name="expression"></param>
/// <returns></returns>
public static object Calculate(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("}");
// 编译代码。
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;
}
}
}
本人QQ 260031207 欢迎来交流!!Top
9 楼piaoyu581(欣欣我心)回复于 2006-03-13 14:11:05 得分 0
谢楼上的了~~~看来偶这方面的知识要好好补补了~~~
结帐Top




