2

DDMathParser用来解析公式并计算结果,效果很好。

问题:

如果替换字典中不存在变量,是否可以将变量设置为默认值?

例子:

我的公式$a + $b需要两个变量$a$b. 但是,我的替换字典仅包含变量 key 的值a(例如 1),但不包含 key b

将变量定义为默认值并避免解析错误消息的首选方法b0什么"unable to resolve variable"

谢谢!

编辑

我使用的方法DDMathParser是循环多个公式并为每个公式提供相同的变量替换字典。有时,我没有变量的值:在这种情况下,变量(键和值)不会包含在字典中。

根据公式本身,如果其中一个变量不存在,我想nil作为公式的结果返回(例如,我没有值profit并且公式是$profit / $revenue,我想返回nil可以转换为NSStringn/a稍后)或将变量设置为,0如果它在字典中不存在(例如,对于类似 的公式$profitA + $profitB + $profitC,我想假设0任何缺少的变量($profitA$profitB$profitC

出于这个原因,我不能使用总是返回0or的通用解决方案,nil但需要将此逻辑放入公式中(例如,作为自定义函数)。

4

2 回答 2

3

首先用适当的默认值初始化替换字典,然后用任何实际值更新它。

于 2013-01-18T15:42:06.690 回答
2

DDMathParser 作者在这里。

如果替换字典中不存在变量,是否可以将变量设置为默认值?

有点儿。您可以通过向variableResolver数学评估器提供一个块来做到这一点:

DDMathEvaluator *evaluator = [DDMathEvaluator sharedMathEvaluator];
[evaluator setVariableResolver:^(NSString *variable) { return @0; }];
NSNumber *n = [evaluator evaluateString:myString withSubstitutions:mySubstitutions];

每当评估器遇到在替换字典中找不到的变量时,都会执行变量解析器块。

向 DDMathParser 添加一个自定义函数是否可行,例如 defaultZero($b) 如果变量 b 存在则检索变量 b 如果不存在则检索为零?

嗯,聪明的主意。你可以,但你基本上是通过模仿 variableResolver 块的行为。您将创建一个新DDMathFunction块并使用-[DDMathEvaluator registerFunction:forName:]告诉评估者它。

但是,我建议只提供一个变量解析器块。会简单很多。


以下是您如何定义一个defaultZero返回参数值或0(如果参数无法评估)的函数:

DMathEvaluator *evaluator = [DDMathEvaluator sharedMathEvaluator];
[evaluator registerFunction:^DDExpression *(NSArray *args, NSDictionary *vars, DDMathEvaluator *eval, NSError *__autoreleasing *error) {
    NSNumber *argValue = nil;
    if ([args count] == 1) {
        // defaultZero() only supports a single argument
        // for anything else, return 0
        DDExpression *arg = [args objectAtIndex:0];
        NSError *argError = nil;
        argValue = [eval evaluateExpression:arg withSubstitutions:vars error:&argError];
    }

    if (argValue == nil) {
        // return 0 if either the arg can't be eval'd or there isn't 1 arg
        argValue = @0;
    }
    return [DDExpression numberExpressionWithNumber:argValue];

} forName:@"defaultZero"];
于 2013-01-19T04:29:52.980 回答