代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
CSharp
】
将字符串转换成表达式执行输出运算结果
作者:
Duncan
/ 发布于
2014/11/18
/
475
using System; using System.Collections.Generic; using System.Text; using System.CodeDom.Compiler;//这个命名空间不要忘了 using System.Reflection; namespace Common.Doing { /// <summary> /// 动态求值 /// </summary> public class Evaluator { /// <summary> /// 计算结果,如果表达式出错则抛出异常 /// </summary> /// <param name="statement">表达式,如"1+2+3+4"</param> /// <returns>结果</returns> public static object Eval(string statement) { //调用实例化后的对象的方法,注意:第一个参数必须为JScript源代码里的方法。且所传字符串里的运算规则或方法也必须为JScript所支持 return _evaluatorType.InvokeMember( "Eval", BindingFlags.InvokeMethod, null, _evaluator, new object[] { statement } ); } static Evaluator() { //构造JScript的编译驱动代码,该语言必须为.net支持的语言,根据语言名称驱动对应的编译器 CodeDomProvider provider = CodeDomProvider.CreateProvider("JScript"); //设置调用编译器的参数,下面参数设置编译器将程序集输出到内存。 CompilerParameters parameters; parameters = new CompilerParameters(); parameters.GenerateInMemory = true; //根据设置的编译器参数对语言源代码进行编译 CompilerResults results; results = provider.CompileAssemblyFromSource(parameters, _jscriptSource); //获取编译好的程序集 Assembly assembly = results.CompiledAssembly; //获取程序集后,使用反射获取程序集中的类 _evaluatorType = assembly.GetType("Evaluator"); //创建获取到的类的实例 _evaluator = Activator.CreateInstance(_evaluatorType); } private static object _evaluator = null; private static Type _evaluatorType = null; /// <summary> /// JScript语言源代码。即你想要被编译的源代码,这个代码里包含了字符串参数中方法或规则。 /// </summary> private static readonly string _jscriptSource = @" import SharpDll; class Evaluator { public function Eval(expr : String) : String { return eval(expr); } public function RoundUp(numVar:double,len:int):double { //var dindex:int = numVar.ToString().IndexOf(" + "\".\"" + @"); //return double.Parse(numVar.ToString().Substring(0,dindex))+ 1; var numRev:double = 0; var dindex:int = numVar.ToString().IndexOf("+"\".\""+ @"); if (dindex> -1) { if (len == 0) { if (int.Parse(numVar.ToString().Substring(dindex+1))> 0) { numRev = double.Parse(numVar.ToString().Substring(0,dindex))+ 1; } } if (len > 0) { if ((dindex + len) > numVar.ToString().Substring(dindex).Length) { numRev = numVar; } else { if (int.Parse(numVar.ToString().Substring(dindex + len+1)) > 0) { var tempnum:double = double.Parse(numVar.ToString().Substring(0,dindex+len+1)) * invokeIn(len)+1; numRev = double.Parse(tempnum.ToString().Insert(tempnum.ToString().Length - len, " + "\".\"" + @")); } else { numRev = double.Parse(numVar.ToString().Substring(0, dindex + len)); } } } } else { numRev = numVar; } return numRev; } public function invokeInt(len:int):int { var TempVal:String = "+"\"1\""+ @"; var i:int = 0; while(i<len) { TempVal = TempVal+" + "\"0\"" + @"; i++; } return int.Parse(TempVal); } }"; } } string exp = "80<=50?80:(80<=100?120:120+RoundUp(Math.round((80-100)/100,6),0)*40)";//Math.round()为jScript 里的方法,RoundUp为上面我定义的方法。 MessageBox.Show(Evaluator.Eval(exp).ToString());
试试其它关键字
字符串
同语言下
.
文件IO 操作类库
.
Check图片类型[JPEG(.jpg 、.jpeg),TIF,GIF,BMP,PNG,P
.
机器名和IP取得(IPV4 IPV6)
.
Tiff转换Bitmap
.
linqHelper
.
MadieHelper.cs
.
RegHelper.cs
.
如果关闭一个窗体后激活另一个窗体的事件或方法
.
创建日志通用类
.
串口辅助开发类
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
Duncan
贡献的其它代码
(
49
)
.
设置HTTP 下载图片
.
计算一个目录的大小
.
浮云效果
.
随机生成信用卡卡号
.
重命名数据库
.
通过文件流读取一个已存在的文件
.
CLI 把16进制字符串转换成数字存到数组
.
显示中文日期
.
在标题栏上显示当前日期
.
创建一个返回上一页的按钮
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3