2011-03-29 55 views
6

我在找一个公式解释器,我可以在C#应用程序中使用。它需要能够解释的字符串像这样:需要公式解释器.Net

max(1+2, 4) * x 

我发现Writing a fast formula interpreter (codeproject.com)几乎做什么,我需要,但它不允许有多个参数的函数。我可能可以添加该功能,但我只是想知道这样的事情是否已经存在。

感谢

+1

可能的重复:http://stackoverflow.com/questions/4629/c-eval-equivalent – 2011-03-29 22:02:24

+0

另一个潜在的重复:http://stackoverflow.com/questions/355062/is-there-a-string-math-网络中的评估者 – 2011-03-29 22:04:05

+1

这些问题相对较老 - Corbins的回答已经链接到两个问题中没有提到的两个项目,所以我说这个问题保持开放。 – Justin 2011-03-29 22:30:39

回答

1

实际上,你可以通过分析建立一个非常有效的解释和用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值。

+0

如果不符合某些安全防范措施,这看起来很危险。 – Ozzah 2011-03-29 22:10:46

+0

@Ozzah:这不像SQL注入。首先,你会限制输入的数量,然后你会解析数学术语,如max,sin,cos等等。任何不是犹太教的东西都会作为语法错误失败。 – 2011-03-29 22:13:08

1

很久以前,在一个项目中,我不得不使用公式创建一些预订,并且使用了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(); 
} 

有了这个,你可以创建自定义公式解释器引擎。