我在找一個公式解釋器,我可以在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