可能的重复:
.NET 中是否有字符串数学评估器?
使用 C# 将字符串表达式转换为整数值
评估数学表达式的最佳和最短方法
c# 评估字符串“3*(4+2)” yield int 18
有没有办法以不同于这里介绍的方式计算像 (2-3/4*12) 这样的数学表达式?
可能的重复:
.NET 中是否有字符串数学评估器?
使用 C# 将字符串表达式转换为整数值
评估数学表达式的最佳和最短方法
c# 评估字符串“3*(4+2)” yield int 18
有没有办法以不同于这里介绍的方式计算像 (2-3/4*12) 这样的数学表达式?
DataTable 有一个Compute方法,允许您编写以下代码:
var result = new DataTable().Compute("2-3/4*12", null);
请注意,这仅限于简单的数学表达式。
其他选项包括在 DLR 中使用动态语言,例如 IronPython 和 IronRuby。签出这篇文章:
var engine = new IronPython.Hosting.PythonEngine();
double result = pythonEngine.EvaluateAs<double>("2-3/4*12");
你也可以查看GitHub 上的 NCalc 库。
有一些有趣的选项可供您使用。
NCalc - 使用 ANTLR 构建的 C# Lexer Parser。这将解析您的文本并允许您为参数/变量分配值。解释器是 C#,因此您不必在应用程序域中加载其他程序集等。
JINT - 一个基于 C# 的 Javascript 解释器,由 ECalc 的同一作者使用 ANTLR 创建语法。这目前处于测试阶段,但适用于计算和函数。
CS-Script.Net - 来自该站点:“CS-Script 是一个基于 CLR(公共语言运行时)的脚本系统,它使用符合 ECMA 标准的 C# 作为编程语言。CS-Script 目前针对 CLR 的 Microsoft 实现(.NET 2.0/ 3.0/3.5) 对 Mono 的支持有限。” 加载脚本并在内存和单独的应用程序域中创建程序集。它非常健壮,我在生产环境中使用它来编写嵌入式脚本。
查看 FLEE(快速轻量级表达式评估器) - http://flee.codeplex.com/
Flee 是 .NET 框架的表达式解析器和求值器。它允许您在运行时计算字符串表达式的值,例如 sqrt(a^2 + b^2)。它使用自定义编译器、强类型表达式语言和轻量级代码生成器将表达式直接编译为 IL。这意味着表达式评估非常快速和高效。试试这个演示,它可以让你根据表情生成图像,然后自己看看。
它免费且快速,我已经在几个项目中使用过它。
注意:这个答案只是为了完整性。这绝对不是我推荐的方法。
可以直接从 C# 访问(不推荐使用的)JScript 库,这意味着您可以使用 JScript 的等效eval
功能。
using Microsoft.JScript; // needs a reference to Microsoft.JScript.dll
using Microsoft.JScript.Vsa; // needs a reference to Microsoft.Vsa.dll
// ...
string expr = "2 - 3 / 4 * 12";
Console.WriteLine(JScriptEval(expr)); // displays -7
// ...
public static VsaEngine _engine = VsaEngine.CreateEngine();
public static double JScriptEval(string expr)
{
// error checking etc removed for brevity
return double.Parse(Eval.JScriptEvaluate(expr, _engine).ToString());
}
绝对属于“不推荐”类别,但为了完整起见——如果您有一个可以方便地连接到的数据库,请将查询“SELECT expression ”发送给它。
呃,这似乎是一个非常过分的解决方案。
你真正想要的是一个简单的解析器。
您需要将字符串分解为标记,然后评估它们。这将使您开始研究。 http://en.wikipedia.org/wiki/Parsing#Overview_of_process
最好的选择是构建表达式树。首先你构建你的表达式树,然后使用http://msdn.microsoft.com/en-us/library/system.linq.expressions.aspx你可以编译它然后使用http://msdn.microsoft.com/ zh-CN/图书馆/bb356928(v=VS.100).aspx