文档原址:http://blog.csdn.net/fangxing80/article/details/5992661

实现复杂公式计算,比如含IF分支判断等,可考虑通过调用EXCEL公式获取值。

Excel公式计算参考:http://www.cnblogs.com/senyier/p/3498526.html

方法一: MSScriptControl.ScriptControl

VB.NET

  1. Dim exp As String = "3 + 4"
  2. Dim t As Type = Type.GetTypeFromProgID("MSScriptControl.ScriptControl")
  3. Dim obj As Object = Activator.CreateInstance(t)
  4. t.InvokeMember("Language", System.Reflection.BindingFlags.SetProperty, _
  5. Nothing, obj, New Object() {"vbscript"})
  6. Dim result As Object = t.InvokeMember("Eval", System.Reflection.BindingFlags.InvokeMethod, _
  7. Nothing, obj, New Object() {exp})
  8. MsgBox("method 1: " & CStr(result))

C#

[c-sharp] view plaincopy

  1. var exp = "3 + (2 + 3)/5";
  2. var type = Type.GetTypeFromProgID("MSScriptControl.ScriptControl");
  3. var obj = Activator.CreateInstance(type);
  4. type.InvokeMember("Language", BindingFlags.SetProperty, null,
  5. obj, new object[] { "javascript" });
  6. var result = type.InvokeMember("Eval", BindingFlags.InvokeMethod, null,
  7. obj, new object[] { exp });
  8. Console.WriteLine("{0} = {1}", exp, result);

方法二: CodeDOM

VB.NET

  1. Dim oCodeProvider As VBCodeProvider = New VBCodeProvider
  2. Dim oCParams As CompilerParameters = New CompilerParameters
  3. Dim oCResults As CompilerResults = Nothing
  4. Dim oAssy As System.Reflection.Assembly = Nothing
  5. Dim oExecInstance As Object = Nothing
  6. Dim oRetObj As Object = Nothing
  7. Dim oMethodInfo As MethodInfo = Nothing
  8. Dim oType As Type = Nothing
  9. Dim strSource As String = _
  10. "Public Class MainClass " + vbCrLf + _
  11. "   Public Shared Function Eval() As Integer" + vbCrLf + _
  12. "      Return 3 + 4" + vbCrLf + _
  13. "   End Function" + vbCrLf + _
  14. "End Class"
  15. oCParams.CompilerOptions = "/t:library"
  16. oCParams.GenerateInMemory = True
  17. oCResults = oCodeProvider.CompileAssemblyFromSource(oCParams, strSource)
  18. If oCResults.Errors.Count <> 0 Then
  19. MsgBox("Error")
  20. End If
  21. oAssy = oCResults.CompiledAssembly
  22. 'oExecInstance = oAssy.CreateInstance("MainClass")
  23. 'oType = oExecInstance.GetType
  24. 'oMethodInfo = oType.GetMethod("Eval")
  25. 'oRetObj = oMethodInfo.Invoke(oExecInstance, Nothing)
  26. oType = oAssy.GetType("MainClass")
  27. oRetObj = oType.InvokeMember("Eval", BindingFlags.InvokeMethod, Nothing, Nothing, Nothing)
  28. MsgBox("method 2: " & CStr(oRetObj))

C#

[c-sharp] view plaincopy

  1. var exp = "3 + (2 + 3)/5";
  2. var csCodeProvider = new CSharpCodeProvider();
  3. var csParams = new CompilerParameters();
  4. var source = "public class MainClass { public static object Eval() { return (#exp#); } }";
  5. source = source.Replace("#exp#", exp);
  6. csParams.CompilerOptions = "/t:library";
  7. csParams.GenerateInMemory = true;
  8. var csResults = csCodeProvider.
  9. CompileAssemblyFromSource(csParams, source);
  10. if (csResults.Errors.Count > 0)
  11. {
  12. Console.WriteLine(csResults.Errors[0].ToString());
  13. return;
  14. }
  15. var ass = csResults.CompiledAssembly;
  16. var type = ass.GetType("MainClass");
  17. var result = type.InvokeMember("Eval", BindingFlags.InvokeMethod,
  18. null, null, null);
  19. Console.WriteLine("{0} = {1}", exp, result);

方法三: DataColumn.Expression & DataTable.Compute方法。

VB.NET

  1. Dim dt As DataTable = New DataTable
  2. dt.Columns.Add("Val1", GetType(Integer))
  3. dt.Columns.Add("Val2", GetType(Integer))
  4. dt.Columns.Add("Result").Expression = String.Format("Val1 + Val2", Me.TextBox1.Text)
  5. dt.Rows.Add(New Object() {3, 4})
  6. MsgBox("method 3: " & dt.Rows(0)("Result"))

C#

[c-sharp] view plaincopy

  1. var exp = "3 + (2 + 3)/5";
  2. DataTable dt = new DataTable();
  3. dt.Columns.Add("Result").Expression = exp;
  4. dt.Rows.Add(dt.NewRow());
  5. var result = dt.Rows[0]["Result"];
  6. Console.WriteLine("{0} = {1}", exp, result);

.Net实现表达式计算(公式) 表达式字符串的更多相关文章

  1. LeetCode_p150_逆波兰表达式计算/后缀表达式计算

    有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说,表达式总会得出有效数值且不存在除 ...

  2. PHP 实现字符串表达式计算

    什么是字符串表达式?即,将我们常见的表达式文本写到了字符串中,如:"$age >= 20",$age 的值是动态的整型变量. 什么是字符串表达式计算?即,我们需要一段程序来执 ...

  3. .NET平台开源项目速览(8)Expression Evaluator表达式计算组件使用

    在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Expression Evaluator验证组件.那里只是概述了一下,并没有对其使用和强大功能做 ...

  4. Java堆栈的应用2----------中缀表达式转为后缀表达式的计算Java实现

    1.堆栈-Stack 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...

  5. 《java数据结构与算法》笔记-CH4-8栈结构实现后缀表达式计算结果

    /** * 中缀表达式转换成后缀表达式: 从输入(中缀表达式)中读取的字符,规则: 操作数: 写至输出 左括号: 推其入栈 右括号: 栈非空时重复以下步骤--> * 若项不为(,则写至输出: 若 ...

  6. C# - 二叉树表达式计算

    很早以前就写过双栈的表达式计算. 这次因为想深入学一下二叉树,网上都是些老掉牙的关于二叉树的基本操作. 感觉如果就学那些概念,没意思也不好记忆.于是动手写了一个表达式计算的应用例子. 这样学习印象才深 ...

  7. c语言,中缀表达式转后缀表达式并计算

    //c语言中缀表达式计算 #include <stdio.h> #include <stdlib.h> #include <string.h> #include & ...

  8. C++实现 逆波兰表达式计算问题

    C++实现 逆波兰表达式计算问题 #include <iostream> #include <string> using namespace std; class Stack ...

  9. NYOJ 305 表达式求值 (字符串处理)

    题目链接 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等.经过训练, ...

随机推荐

  1. JavaScript小细节点罗列(1)

    共勉! 属性访问表达式 众所周知,JavaScript为属性的访问定义了两种语法方式: 表达式.标识符 // 表达式(指定对象) 标识符(指定需要访问的属性的名称) 表达式[表达式] //表达式1(指 ...

  2. MapReduce:Shuffle过程详解

    1.Map任务处理 1.1 读取HDFS中的文件.每一行解析成一个<k,v>.每一个键值对调用一次map函数.                <0,hello you>   & ...

  3. 拖拽进度条(SeekBar)

    拖拽进度条(SeekBar) 监听方法:setOnSeekBarChangeListener 监听器:SeekBar.OnSeekBarChangeListener 简单,直接上代码: 1.Activ ...

  4. 一:JavaWeb和Tomcat的安装

    1.Java Web 是java技术用来解决相关web互联网领域的技术总和. 2.Servlet是Java Servlet的简称,称为小服务程序或服务器连接器,用Java编写的服务器端程序 3.JSP ...

  5. ubuntu 命令、linux环境变量设置

    解压与压缩: tar.gz格式tar -xzvf xxx jar格式jar -xvf xxx.jar zip格式unzip xxx.zip zip -r xxx.zip xxx unarunar -e ...

  6. leetCode题解之旋转数字

    1.题目描述 X is a good number if after rotating each digit individually by 180 degrees, we get a valid n ...

  7. solr学习笔记

    目录 前言 linux部署 使用 配置 使用 前言 solr是apach基于Lucene开发的成熟的框架,这里我们学习如何部署.使用.关于集群会在后面继续添加 linux部署 mkdir /usr/l ...

  8. Hibernate的increment主键生成机制带来的问题

    最近给学校做的系统,总出现主键插入冲突的问题.主键是通过hibernate自动生成的,设置increment属性,总出现Duplicate entry的错误.搜到解决方案如下: 在网站运行在apach ...

  9. 转: C# 的结构剖析

    原文链接:http://www.cnblogs.com/jiajiayuan/archive/2011/09/20/2181582.html 本文意在巩固基础知识,并不是对其进行深入剖析,还望理解.本 ...

  10. [翻译] SSKeychain

    SSKeychain https://github.com/soffes/sskeychain SSKeychain is a simple wrapper for accessing account ...