【问题标题】:DDMathParser: How to define default values for variablesDDMathParser:如何定义变量的默认值
【发布时间】:2013-01-18 15:36:29
【问题描述】:

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

问题:

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

示例:

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

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

谢谢!

编辑

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

根据公式本身,如果其中一个变量不存在,我想返回 nil 作为公式的结果(例如,我没有 profit 的值,而公式是 $profit / $revenue ,我想返回nil,我可以稍后将其转换为n/aNSString)或将变量设置为0,如果它在字典中不存在(例如,对于像$profitA + $profitB + $profitC这样的公式,我想假设 0 用于任何缺失的变量($profitA$profitB$profitC)。

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

【问题讨论】:

    标签: ios objective-c parsing nsdictionary nspredicate


    【解决方案1】:

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

    【讨论】:

    • DDMathParser 添加一个自定义函数是否可行,例如defaultZero($b),如果变量b 存在则检索变量b,否则为零?
    • @AlexR 因为你有代码,你可以做任何你想做的改变。如果您想要这样做,添加逻辑以使用零作为缺失变量应该很容易。
    【解决方案2】:

    DDMathParser 作者在这里。

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

    有点。您可以通过向数学评估器提供 variableResolver 块来实现:

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

    每当求值器遇到一个在替换字典中找不到的变量时,变量解析器块就会被执行。

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

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

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


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

    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"];
    

    【讨论】:

    • 感谢您的回答,戴夫!我已经更新了我的问题并试图描述如果其中一个变量丢失或将默认值设置为0,我需要返回nil。应在公式中设置此逻辑。这就是为什么我认为自定义函数可能更适合这种情况。但是,我不完全了解如何在自定义函数中执行此操作(我已阅读 DDMathParser Wiki,但仍不完全了解如何编写此代码)。你有什么建议吗?谢谢!
    • @AlexR 我已经用如何定义defaultZero 函数的示例更新了答案。
    • 太棒了!非常感谢您的支持和创建DDMathParser
    猜你喜欢
    • 2019-08-08
    • 2014-08-07
    • 1970-01-01
    • 2020-12-01
    • 2016-05-08
    • 1970-01-01
    • 2023-01-10
    • 2016-09-10
    • 1970-01-01
    相关资源
    最近更新 更多