我正在尝试生成一个可能是这样的公式,这只是一个示例,
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);
然而即使我的字符串为lhs
和rhs
,甚至我的操作符>
在上面的代码中,我也无法理解如何应用公式表单本身。我只需要知道哪个列与哪个运算符相关联。
因为我有单独的列名,但不是之前的运算符,例如
在+
之前的A
之前的-
A
在另一个案例中{/ 1}}。
我如何解析上述请帮助。
答案 0 :(得分: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());
答案 1 :(得分:3)