通过给出的求值运算公式字符串得到其结果值

原创 2004年06月23日 13:39:00

在实际开发中有时需要根据用户制定的公式然后经过处理并将数值代替参数后来得出此公式的值,因为刚好也做到这里,看了些资料,于是写了一个类调用来实现此功能

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

利用EXCEL 实现字符串的计算

     如何计算给定的字符串计算表达式,如“ 1+2*3-4/5+ 6^7” 的值?笔者在使用EXCEL2002 时发现在单元格中可以输入此类表达式,输出的则是计算结果,所以写了一个函数,与大家共享...
  • northwolves
  • northwolves
  • 2004年04月07日 22:20
  • 1964

SAP-ABAP 通过字符串计算公式,执行计算的函数:EVAL_FORMULA

abap 编辑好的字符串,其中字符串中为 计算公式的内容,通过函数:EVAL_FORMULA,可以通过公式算出结果 UF_FORMULA = '66.34 - 39.333 + ( 1 *4...
  • forever_crazy
  • forever_crazy
  • 2016年04月11日 11:03
  • 1311

ABAP 对字符串公式进行计算

函数:EVAL_FORMULA 参考代码: DATA:formula TYPE string,      l_value TYPE f,      l_dmbtr TYPE mseg-...
  • zhongguomao
  • zhongguomao
  • 2014年04月17日 17:21
  • 1185

华为OJ(表达式求值)

描述 给定一个字符串描述的算术表达式,计算出结果值。输入字符串长度不超过100,合法的字符包括”+, -, *, /, (, )”,”0-9”,字符串内容的合法性及表达式语法的合法性由做题者检查。本...
  • yiqiwangxi
  • yiqiwangxi
  • 2015年08月22日 15:21
  • 977

JAVA实现字符串表达式求值

问题描述:根据用户输入的字符串表达式求出等式的结果 包括+ -*/和() 原理就是利用栈构建出表达式的后缀式并求出最后的结果值 一、构建后缀表达式 构建的过程及原理就是:构建一个操作符栈,和一个...
  • Nickjun123
  • Nickjun123
  • 2015年08月12日 00:04
  • 2280

Linux c==sqlite的sqlite3_get_table(37)

{ sqlite3 *db; charchar *errmsg=NULL; //用来存储错误信息字符串 char ret=0; int my_age=0; //类型...
  • weirdosick
  • weirdosick
  • 2016年12月18日 13:47
  • 155

蓝桥杯-组合公式求值(java)

算法提高 组合公式求值 时间限制:1.0s 内存限制:256.0MB 问题描述   给定n, m,求: ...
  • sihai12345
  • sihai12345
  • 2017年04月03日 23:32
  • 898

ACM--表达式求值实现

这个是南阳OJ上的第35题,地址:点击打开链接     表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述ACM队的mdd想做一个计算器,但是,他要...
  • qq_26891045
  • qq_26891045
  • 2016年03月14日 22:02
  • 1124

表达式求值顺序潜在的缺陷

 C++primer 第124页一问题: C++语言没有明确规定大多数二元运算符的求值顺序,给编译器优化留下了余地,这种策略实际上是在代码生成效率和程序潜在缺陷之间进行了权衡,...
  • wmaoshu
  • wmaoshu
  • 2015年11月30日 17:12
  • 590

['LeetCode']表达式求值

Eval Expression(栈)表达式求值是指给定一个表达式字符串,求得表达式最后的值。 例如给定表达式: 3 + 2 * (4 + 1) ,通过表达式求值后得到的值为13。这里之所以写Leet...
  • zjx409
  • zjx409
  • 2015年06月30日 14:55
  • 733
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通过给出的求值运算公式字符串得到其结果值
举报原因:
原因补充:

(最多只允许输入30个字)