26

可能的重复:
.NET 中是否有字符串数学评估器?
使用 C# 将字符串表达式转换为整数值
评估数学表达式的最佳和最短方法
c# 评估字符串“3*(4+2)” yield int 18

有没有办法以不同于这里介绍的方式计算像 (2-3/4*12) 这样的数学表达式?

http://www.c-sharpcorner.com/uploadfile/mgold/codedomcalculator08082005003253am/codedomcalculator.aspx

4

7 回答 7

70

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 库

于 2010-05-18T16:24:56.400 回答
8

有一些有趣的选项可供您使用。

  1. NCalc - 使用 ANTLR 构建的 C# Lexer Parser。这将解析您的文本并允许您为参数/变量分配值。解释器是 C#,因此您不必在应用程序域中加载其他程序集等。

  2. JINT - 一个基于 C# 的 Javascript 解释器,由 ECalc 的同一作者使用 ANTLR 创建语法。这目前处于测试阶段,但适用于计算和函数。

  3. CS-Script.Net - 来自该站点:“CS-Script 是一个基于 CLR(公共语言运行时)的脚本系统,它使用符合 ECMA 标准的 C# 作为编程语言。CS-Script 目前针对 CLR 的 Microsoft 实现(.NET 2.0/ 3.0/3.5) 对 Mono 的支持有限。” 加载脚本并在内存和单独的应用程序域中创建程序集。它非常健壮,我在生产环境中使用它来编写嵌入式脚本。

于 2010-05-18T16:39:34.607 回答
4

查看 FLEE(快速轻量级表达式评估器) - http://flee.codeplex.com/

Flee 是 .NET 框架的表达式解析器和求值器。它允许您在运行时计算字符串表达式的值,例如 sqrt(a^2 + b^2)。它使用自定义编译器、强类型表达式语言和轻量级代码生成器将表达式直接编译为 IL。这意味着表达式评估非常快速和高效。试试这个演示,它可以让你根据表情生成图像,然后自己看看。

它免费且快速,我已经在几个项目中使用过它。

于 2010-05-18T16:29:08.437 回答
4

注意:这个答案只是为了完整性。这绝对不是我推荐的方法。

可以直接从 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());
}
于 2010-05-18T16:39:07.917 回答
3

绝对属于“不推荐”类别,但为了完整起见——如果您有一个可以方便地连接到的数据库,请将查询“SELECT expression ”发送给它。

于 2010-05-18T17:17:41.923 回答
0

呃,这似乎是一个非常过分的解决方案。

你真正想要的是一个简单的解析器。

您需要将字符串分解为标记,然后评估它们。这将使您开始研究。 http://en.wikipedia.org/wiki/Parsing#Overview_of_process

于 2010-05-18T16:27:28.767 回答
0

最好的选择是构建表达式树。首先你构建你的表达式树,然后使用http://msdn.microsoft.com/en-us/library/system.linq.expressions.aspx你可以编译它然后使用http://msdn.microsoft.com/ zh-CN/图书馆/bb356928(v=VS.100).aspx

于 2010-05-18T16:28:39.797 回答