.Net实现表达式计算(公式) 表达式字符串
文档原址:http://blog.csdn.net/fangxing80/article/details/5992661
实现复杂公式计算,比如含IF分支判断等,可考虑通过调用EXCEL公式获取值。
Excel公式计算参考:http://www.cnblogs.com/senyier/p/3498526.html
方法一: MSScriptControl.ScriptControl
VB.NET
- Dim exp As String = "3 + 4"
- Dim t As Type = Type.GetTypeFromProgID("MSScriptControl.ScriptControl")
- Dim obj As Object = Activator.CreateInstance(t)
- t.InvokeMember("Language", System.Reflection.BindingFlags.SetProperty, _
- Nothing, obj, New Object() {"vbscript"})
- Dim result As Object = t.InvokeMember("Eval", System.Reflection.BindingFlags.InvokeMethod, _
- Nothing, obj, New Object() {exp})
- MsgBox("method 1: " & CStr(result))
C#
- var exp = "3 + (2 + 3)/5";
- var type = Type.GetTypeFromProgID("MSScriptControl.ScriptControl");
- var obj = Activator.CreateInstance(type);
- type.InvokeMember("Language", BindingFlags.SetProperty, null,
- obj, new object[] { "javascript" });
- var result = type.InvokeMember("Eval", BindingFlags.InvokeMethod, null,
- obj, new object[] { exp });
- Console.WriteLine("{0} = {1}", exp, result);
方法二: CodeDOM
VB.NET
- Dim oCodeProvider As VBCodeProvider = New VBCodeProvider
- Dim oCParams As CompilerParameters = New CompilerParameters
- Dim oCResults As CompilerResults = Nothing
- Dim oAssy As System.Reflection.Assembly = Nothing
- Dim oExecInstance As Object = Nothing
- Dim oRetObj As Object = Nothing
- Dim oMethodInfo As MethodInfo = Nothing
- Dim oType As Type = Nothing
- Dim strSource As String = _
- "Public Class MainClass " + vbCrLf + _
- " Public Shared Function Eval() As Integer" + vbCrLf + _
- " Return 3 + 4" + vbCrLf + _
- " End Function" + vbCrLf + _
- "End Class"
- oCParams.CompilerOptions = "/t:library"
- oCParams.GenerateInMemory = True
- oCResults = oCodeProvider.CompileAssemblyFromSource(oCParams, strSource)
- If oCResults.Errors.Count <> 0 Then
- MsgBox("Error")
- End If
- oAssy = oCResults.CompiledAssembly
- 'oExecInstance = oAssy.CreateInstance("MainClass")
- 'oType = oExecInstance.GetType
- 'oMethodInfo = oType.GetMethod("Eval")
- 'oRetObj = oMethodInfo.Invoke(oExecInstance, Nothing)
- oType = oAssy.GetType("MainClass")
- oRetObj = oType.InvokeMember("Eval", BindingFlags.InvokeMethod, Nothing, Nothing, Nothing)
- MsgBox("method 2: " & CStr(oRetObj))
C#
- var exp = "3 + (2 + 3)/5";
- var csCodeProvider = new CSharpCodeProvider();
- var csParams = new CompilerParameters();
- var source = "public class MainClass { public static object Eval() { return (#exp#); } }";
- source = source.Replace("#exp#", exp);
- csParams.CompilerOptions = "/t:library";
- csParams.GenerateInMemory = true;
- var csResults = csCodeProvider.
- CompileAssemblyFromSource(csParams, source);
- if (csResults.Errors.Count > 0)
- {
- Console.WriteLine(csResults.Errors[0].ToString());
- return;
- }
- var ass = csResults.CompiledAssembly;
- var type = ass.GetType("MainClass");
- var result = type.InvokeMember("Eval", BindingFlags.InvokeMethod,
- null, null, null);
- Console.WriteLine("{0} = {1}", exp, result);
方法三: DataColumn.Expression & DataTable.Compute方法。
VB.NET
- Dim dt As DataTable = New DataTable
- dt.Columns.Add("Val1", GetType(Integer))
- dt.Columns.Add("Val2", GetType(Integer))
- dt.Columns.Add("Result").Expression = String.Format("Val1 + Val2", Me.TextBox1.Text)
- dt.Rows.Add(New Object() {3, 4})
- MsgBox("method 3: " & dt.Rows(0)("Result"))
C#
- var exp = "3 + (2 + 3)/5";
- DataTable dt = new DataTable();
- dt.Columns.Add("Result").Expression = exp;
- dt.Rows.Add(dt.NewRow());
- var result = dt.Rows[0]["Result"];
- Console.WriteLine("{0} = {1}", exp, result);
.Net实现表达式计算(公式) 表达式字符串的更多相关文章
- LeetCode_p150_逆波兰表达式计算/后缀表达式计算
有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说,表达式总会得出有效数值且不存在除 ...
- PHP 实现字符串表达式计算
什么是字符串表达式?即,将我们常见的表达式文本写到了字符串中,如:"$age >= 20",$age 的值是动态的整型变量. 什么是字符串表达式计算?即,我们需要一段程序来执 ...
- .NET平台开源项目速览(8)Expression Evaluator表达式计算组件使用
在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下Expression Evaluator验证组件.那里只是概述了一下,并没有对其使用和强大功能做 ...
- Java堆栈的应用2----------中缀表达式转为后缀表达式的计算Java实现
1.堆栈-Stack 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...
- 《java数据结构与算法》笔记-CH4-8栈结构实现后缀表达式计算结果
/** * 中缀表达式转换成后缀表达式: 从输入(中缀表达式)中读取的字符,规则: 操作数: 写至输出 左括号: 推其入栈 右括号: 栈非空时重复以下步骤--> * 若项不为(,则写至输出: 若 ...
- C# - 二叉树表达式计算
很早以前就写过双栈的表达式计算. 这次因为想深入学一下二叉树,网上都是些老掉牙的关于二叉树的基本操作. 感觉如果就学那些概念,没意思也不好记忆.于是动手写了一个表达式计算的应用例子. 这样学习印象才深 ...
- c语言,中缀表达式转后缀表达式并计算
//c语言中缀表达式计算 #include <stdio.h> #include <stdlib.h> #include <string.h> #include & ...
- C++实现 逆波兰表达式计算问题
C++实现 逆波兰表达式计算问题 #include <iostream> #include <string> using namespace std; class Stack ...
- NYOJ 305 表达式求值 (字符串处理)
题目链接 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等.经过训练, ...
随机推荐
- 【代码笔记】iOS-DropDownDemo-下拉按钮效果
一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...
- Python爬虫学习记录【内附代码、详细步骤】
引言: 昨天在网易云课堂自学了<Python网络爬虫实战>,视频链接 老师讲的很清晰,跟着实践一遍就能掌握爬虫基础了,强烈推荐! 另外,在网上看到一位学友整理的课程记录,非常详细,可以优先 ...
- elixir 表单 map
键-值对 iex(13)> map = %{:a => 1, 2 => :b}%{2 => :b, :a => 1}iex(14)> map[:a]1iex(15) ...
- 网络I/O模型--05多路复用I/O
多路复用I/O模型在应用层工作效率比我们俗称的 BIO 模型快的本质原因是,前者不再使用操作系统级别的“同步 I/O”模型 . 在 Linux 操作系统环境下, 多路复用 I/O 模型就是技术人员通常 ...
- 报表在IBM AIX系统下resin部署
报表是用java开发的,具有良好的跨平台性.不仅可以应用在windows.linux.操作系统,还可以应用在AIX等等的unix操作系统.在各种操作系统上部署过程有一些差别.下面说一下在AIX操 ...
- Vue 框架-12-Vue 项目的详细开发流程
Vue 框架-12-Vue 项目的详细开发流程 首先,如果你还不了解 Vue 脚手架怎么搭建? 默认的环境中有哪些文件? 文件大概是什么作用? 那么,您要先查看之前的文章才有助于你理解本篇文章: Vu ...
- owin Claims-based认证登录实现
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext c ...
- 为什么选用 React 创建混合型移动应用?
[编者按]本文作者为 14islands 联合创始人.创新 Web 开发者 David Lindkvist,主要介绍有关混合型应用搭建的方方面面.文章系国内 ITOM 管理平台 OneAPM 编译呈现 ...
- git工具的使用
Git工具的出现降低了软件版本维护的成本,极大的提高了工作效率,在这里列出了一些使用方法,方便以后查看. 1.Git的初始化->创建一个Git仓库:git init 2.创建信息:git con ...
- logback总结
Logback Logback由三大模块组成:logback-core.logback- classic和logback-access. Logback-core是其它两个模块的基础模块. Logba ...