通过给出的求值运算公式字符串得到其结果值
来源:互联网 发布:mac邮件服务器设置 编辑:程序博客网 时间:2024/06/11 11:34
在实际开发中有时需要根据用户制定的公式然后经过处理并将数值代替参数后来得出此公式的值,因为刚好也做到这里,看了些资料,于是写了一个类调用来实现此功能
using System;
using System.Text;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Reflection;
public class Evaluator {
object _compiled = null;
private string m_formula;
/// <summary>
/// 计算公式
/// </summary>
public string Formula{
get{
return m_formula;
}
set{
m_formula = value;
}
}
public Evaluator() {
}
public Evaluator(string formula){
Formula = formula;
}
public Double Execute(){
if(Formula == null || Formula == ""){
throw new Exception("请先设置Formula属性!");
}
return this.Execute(Formula);
}
public Double Execute(string formula){
constructEvaluator(formula);
MethodInfo m = _compiled.GetType().GetMethod("GetValue");
return (Double)m.Invoke(_compiled, null);
}
private void constructEvaluator(string formula) {
ICodeCompiler compiler = (new CSharpCodeProvider().CreateCompiler());
CompilerParameters cp = new CompilerParameters();
cp.ReferencedAssemblies.Add("system.dll");
cp.GenerateExecutable = false;
cp.GenerateInMemory = true;
StringBuilder str = new StringBuilder();
str.Append("using System; /n");
str.Append("namespace Stoway { /n");
str.Append("public class Formula { /n");
str.AppendFormat(" public {0} GetValue()","Double");
str.Append("{");
str.AppendFormat(" return Convert.ToDouble({0}); ", formula);
str.Append("}/n");
str.Append("}/n");
str.Append("}");
CompilerResults cr = compiler.CompileAssemblyFromSource(cp, str.ToString());
if (cr.Errors.HasErrors) {
throw new Exception("不是正确的表达式");
}
Assembly a = cr.CompiledAssembly;
_compiled = a.CreateInstance("Stoway.Formula");
}
public static Double GetValue(string formula){
return new Evaluator().Execute(formula);
}
}
-----------
调用方法:
Evaluator evaluator = new Evaluator();
Double num = evaluator.Execute("( 3 + 5 ) * 2 + 56 / 0.25");
也可以:
Double num = Evaluator.GetValue("( 3 + 5 ) * 2 + 56 / 0.25");
-------------------------------------------------------
相关:
http://www.codeproject.com/csharp/matheval.asp
http://www.codeproject.com/csharp/runtime_eval.asp
- 通过给出的求值运算公式字符串得到其结果值
- java运算计算的方式得到的结果和通过计数器得到的结果不一样
- 字符串数学运算处理 字符解析求值运算结果
- 公式字符串求值
- 《文本计算器》数学字符串转换公式进行运算并得到值
- 字符串问题---公式字符串求值
- 通过UIView得到其UIViewController
- Java通过反射得到其属性的值包含父类属性
- 算法题: 求一个整数数组中,通过元素加减运算得到指定结果的所有运算过程. 例如【5,4,6,7,1】= 9 ?
- 算法题: 求一个整数数组中,通过元素加减运算得到指定结果的所有运算过程. 例如【5,4,6,7,1】= 9 ?
- 华为:通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串
- 华为:通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串
- 通过键盘输入100 以内正整数的加、减运算式,请编写一个程序输出运算结果字符串
- 通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。
- asp.net中将一个随机的运算公式字符串转变为运算公式进行运算
- 根据字符串的长度得到其在屏幕上的px值
- 给出如下程序的结果
- 栈的应用:通过用户输入后缀表达式,利用数据结构栈计算其结果值。
- 在项目中要用到网页的末态对话框。找到一篇有关于模态对话框的文章 特此转载一下。
- CSDN就是专业呀,blog做的好漂亮啊.
- NT服务中线程间相互关系
- 测试Blog
- 开张大吉!!
- 通过给出的求值运算公式字符串得到其结果值
- 第一次拥有自己的blog
- Apache学习笔记
- 第一次接触blog
- 申请成功
- Exception Management Architecture Guide
- 哈哈..BLOG申请成功..
- DudoJ是什么?
- Test