2011-03-29 59 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(); 
} 

有了這個,你可以創建自定義公式解釋器引擎。