2013-07-11 62 views
0

我試圖產生可能是這樣的事情一個公式,這只是一個樣本,如何解析以下字符串

A + B + C > D - A 

現在,A,B,C,d,等等都是列名一張表格(如excel表格)我將在內存中訪問。

我需要生成一個規則,就像上面的A + B + C > D - A一樣,它將決定用戶可以在Cell中添加什麼樣的值。

目前我就是這樣開始:

string toValidate = "A + B + C > D + E - A"; 
string lhs = "", rhs = ""; 
string[] comparisonOperators = new string[] { "=", ">", "<", "<>", "!=" }; 
char[] arithmeticOperators = { '+', '-', '/', '*' }; 
toValidate = toValidate.Replace(@" ", ""); 
for (int i = 0; i < comparisonOperators.Length; i++) 
{ 
    if (toValidate.Contains(comparisonOperators[i])) 
    { 
     operatorIndex = toValidate.IndexOf(comparisonOperators[i]); 
     break; 
    } 
} 
lhs = toValidate.Substring(0, operatorIndex); 
rhs = toValidate.Substring(operatorIndex + 1); 
string[] columnLhsList = lhs.Split(arithmeticOperators); 
string[] columnRhsList = rhs.Split(arithmeticOperators); 

然而,即使我有字符串作爲lhsrhs,甚至我的運營商,其>在上面的代碼,我不能夠理解我怎麼能在工作表本身上應用公式。我只需要知道哪個Column有哪個操作員關聯。

因爲我在另一種情況下A之前有個別的列名,但不是經營者面前,爲e.g,

+之前A-

我如何解析上述請幫助。

回答

3

它,但是,如果你想簡單的公式解析器這樣自己一個非常有趣的問題。

我建議你看看這篇文章,因爲它是非常清晰的書面和可理解的,因爲它。

Shunting-yard Algorithm

3

就我個人而言,我絕不會嘗試/敢於創建我自己的公式表達式解析器。相反,我會(並確實)使用其中一種可用的方法,例如NCalc over at CodePlex.com

使用這些工具,它是寫

Expression e = new Expression("2 + 3 * 5"); 
Debug.Assert(17 == e.Evaluate()); 

讓您的公式計算一樣容易。

通常這樣的庫非常堅固,經過很好的測試並且具有豐富的功能集。這將需要很長時間(如果有的話)自己做這樣一個高質量的圖書館。

爲了進一步舉NCalc網站,你甚至可以使用變量,如例如: -

Expression e = new Expression("Round(Pow([Pi], 2) + Pow([Pi2], 2) + [X], 2)"); 

e.Parameters["Pi2"] = new Expression("Pi * [Pi]"); 
e.Parameters["X"] = 10; 

e.EvaluateParameter += 
    delegate(string name, ParameterArgs args) 
    { 
     if (name == "Pi") 
     args.Result = 3.14; 
    }; 

Debug.Assert(117.07 == e.Evaluate());