我在找一个公式解释器,我可以在C#应用程序中使用。它需要能够解释的字符串像这样:需要公式解释器.Net
max(1+2, 4) * x
我发现Writing a fast formula interpreter (codeproject.com)几乎做什么,我需要,但它不允许有多个参数的函数。我可能可以添加该功能,但我只是想知道这样的事情是否已经存在。
感谢
我在找一个公式解释器,我可以在C#应用程序中使用。它需要能够解释的字符串像这样:需要公式解释器.Net
max(1+2, 4) * x
我发现Writing a fast formula interpreter (codeproject.com)几乎做什么,我需要,但它不允许有多个参数的函数。我可能可以添加该功能,但我只是想知道这样的事情是否已经存在。
感谢
我已经在过去使用没有问题的夫妇:
实际上,你可以通过分析建立一个非常有效的解释和用Math.Max代替某些功能性关键字,如max
,然后用dynamically building and executing该公式作为C#类和方法。所以实际上你会解析和包装公式并允许C#编译器解释并执行它。
因此,服用max(1+2, 4) * x
你的样品公式将变成:
public class MyFormula
{
public double calc(double x)
{
return Math.Max(1+2, 4) * x;
}
}
,你会编的飞行,然后每个链接的文章中执行。当然,您仍然需要解析并传递x值。
如果不符合某些安全防范措施,这看起来很危险。 – Ozzah 2011-03-29 22:10:46
@Ozzah:这不像SQL注入。首先,你会限制输入的数量,然后你会解析数学术语,如max,sin,cos等等。任何不是犹太教的东西都会作为语法错误失败。 – 2011-03-29 22:13:08
很久以前,在一个项目中,我不得不使用公式创建一些预订,并且使用了VsaEngine。要使用此引擎,您需要添加对Microsoft.JScript
的引用。下面是例子:
代码的用法很简单,只需更换配方参数,如:
string formula = "x+y";
formula= formula.Replace("x","100").Replace("y","200");
string result = CalculateFormula(formula);
,这里是核心方法,CalculateFormula:
public string CalculateFormula(string evaluationString)
{
VsaEngine en = VsaEngine.CreateEngine();
Object result = Eval.JScriptEvaluate(evaluationString, en);
return result.ToString();
}
有了这个,你可以创建自定义公式解释器引擎。
可能的重复:http://stackoverflow.com/questions/4629/c-eval-equivalent – 2011-03-29 22:02:24
另一个潜在的重复:http://stackoverflow.com/questions/355062/is-there-a-string-math-网络中的评估者 – 2011-03-29 22:04:05
这些问题相对较老 - Corbins的回答已经链接到两个问题中没有提到的两个项目,所以我说这个问题保持开放。 – Justin 2011-03-29 22:30:39