如何处理 NCALC 的 IF 表达式中的空值
how to handle null in IF expression of NCALC
我有一个复杂的 NCALC if 表达式,它是这样的:
if ( {0} == null || {1} == 0 ,{2} * ({3} * {4} + {5}), ({2} * ({3} * {4} + {5}))/{1})
这给了我一些意想不到的错误,如下所示:
missing ')' at '==' at line 1:6
missing EOF at 'UnsetValue' at line 1:37
这里有什么问题 - 我找不到 NCALC 是否支持 null。如果是这样,那么上面的表达式可能有什么问题。请帮忙!!
我的经验是ncalc不支持null。但是你可以编写自己的函数来评估传入的参数是否有值并且return true / false.
为此,连接一个 EvaluateFinction。 {下面的小例子)
var exp = new NCalc.Expression("if(HASVALUE([variable], [variable] *2, 0)")
exp.Parameters["variable"] = 2;
exp.EvaluateFunction += SpecRule_EvaluateFunction;
private void SpecRule_EvaluateFunction(string name, NCalc.FunctionArgs args)
{
switch (name.ToUpper())
{
case "HASVALUE":
if (args.Parameters.Length < 1)
throw new ArgumentException("IsNull must have at least 1 argument");
args.Result = args.Parameters[0].Parameters.Values.FirstOrDefault() != null;
break;
}
}
至少在 2021 年,您可以将一些选项传递给 NCalc 以允许空值。
Expression e = new Expression(expression, EvaluateOptions.AllowNullParameter);
我有一个复杂的 NCALC if 表达式,它是这样的:
if ( {0} == null || {1} == 0 ,{2} * ({3} * {4} + {5}), ({2} * ({3} * {4} + {5}))/{1})
这给了我一些意想不到的错误,如下所示:
missing ')' at '==' at line 1:6
missing EOF at 'UnsetValue' at line 1:37
这里有什么问题 - 我找不到 NCALC 是否支持 null。如果是这样,那么上面的表达式可能有什么问题。请帮忙!!
我的经验是ncalc不支持null。但是你可以编写自己的函数来评估传入的参数是否有值并且return true / false.
为此,连接一个 EvaluateFinction。 {下面的小例子)
var exp = new NCalc.Expression("if(HASVALUE([variable], [variable] *2, 0)")
exp.Parameters["variable"] = 2;
exp.EvaluateFunction += SpecRule_EvaluateFunction;
private void SpecRule_EvaluateFunction(string name, NCalc.FunctionArgs args)
{
switch (name.ToUpper())
{
case "HASVALUE":
if (args.Parameters.Length < 1)
throw new ArgumentException("IsNull must have at least 1 argument");
args.Result = args.Parameters[0].Parameters.Values.FirstOrDefault() != null;
break;
}
}
至少在 2021 年,您可以将一些选项传递给 NCalc 以允许空值。
Expression e = new Expression(expression, EvaluateOptions.AllowNullParameter);