我正在用 c# (winforms) 制作一个计算器,我想知道是否有一种简单的方法来计算包含多个计算的字符串,例如:如果您有字符串
"124+241/2*5"
让程序计算它,然后得到一个 int 输出。
提前致谢。
嗯,您基本上是在寻找 Javascript 的
eval()
函数的 C# 等效项。
我推荐图书馆NCalc。
var result = new Expression("124+241/2*5").Evaluate()
另一个计算引擎是Jace.NET。
Dictionary<string, double> variables = new Dictionary<string, double>();
variables.Add("var1", 2.5);
variables.Add("var2", 3.4);
CalculationEngine engine = new CalculationEngine();
double result = engine.Calculate("var1*var2", variables);
截至 2024 年,您还可以查看 Adletec.Sonic(sonic),它最初是 Jace.NET 的一个分支,现已不再维护。它可以动态编译表达式以进行本机执行以获得高性能。
var expression = "var1*var2";
var variables = new Dictionary<string, double>();
variables.Add("var1", 2.5);
variables.Add("var2", 3.4);
var engine = Evaluator.CreateWithDefaults();
double result = engine.Evaluate(expression, variables); // 8.5
还有动态 Expresso。
var result = new Interpreter().Eval("124+241/2*5");
并且您可以使用 Roslyn's ScriptingEngine 来评估:
Roslyn.Scripting.Session session = roslynEngine.CreateSession();
session.Execute("124+241/2*5");
嗯,“简单”实际上是一个相当广泛的术语......我应该说是相对的。不管怎样,有一些库已经证明自己非常强大,并且在诸如此类的事情上非常受欢迎。
第一个是NCALC(http://ncalc.codeplex.com/):
// One of the examples.
Expression e = new Expression("2 + 3 * 5");
第二个是Jace.NET(https://github.com/pieterderycke/Jace):
// One of the examples.
CalculationEngine engine = new CalculationEngine();
Func<Dictionary<string, double>, double> formula = engine.Build("var1+2/(3*otherVariable)");
Dictionary<string, double> variables = new Dictionary<string, double>();
variables.Add("var1", 2);
variables.Add("otherVariable", 4.2);
double result = formula(variables);
两者都很棒,但根据之前的经验,我发现 Jace.NET 在更复杂的表达式上表现更好一些(这里对您来说应该不是问题)。
没有自动方法可以做到这一点,您要么必须手动解析它,要么使用某种相当于 JavaScript 的功能
eval()
。
一个不需要使用外部库的不错的替代方案是
System.Data.DataTable.Compute
:
public double Evaluate(string expr)
{
System.Data.DataTable table = new System.Data.DataTable();
return Convert.ToDouble(table.Compute(expr, String.Empty));
}
CodeDom 和 Reflection 使您能够动态地将 C# 代码构建为字符串、编译它并在程序中运行它。 .NET 中这一非常强大的功能使我们能够创建 CodeDom 计算器,该计算器可以计算 Windows 窗体内的表达式(甚至 C# 代码行)。
如果我理解正确,你需要这样的东西:Dynamic Expresso 您可以使用 NuGet 将其添加到您的程序中