【问题标题】:How to evaluate the string equation in ios如何在ios中评估字符串方程
【发布时间】:2013-05-23 01:26:00
【问题描述】:

有没有办法解决ios中的字符串方程?

例如

输入:

NSString * str =@"1+2";

输出:

NSInteger result = 3 // 即来自str的1+2之和

如何解决这个问题并获得预期的结果!

请帮忙!

【问题讨论】:

    标签: ios objective-c ios5 nsstring nsinteger


    【解决方案1】:

    您可以做的是,您可以使用此方法获取由符号“+”分隔的字符串的组件,然后您将获得组件数组,即 1,2。

    NSArray* foo = [str componentsSeparatedByString: @"+"];

    int result = [[foo objectAtIndex:0] integerValue] + [[foo objectAtIndex:1] integerValue];

    然后您可以使用这两个元素的整数值并将它们相加并将结果存储在整数变量中。

    【讨论】:

    • 如果* 而不是+,你会怎么做??
    • @Anil 将 + 替换为 * :)
    • @RajanBalana 由 AminNegm-Awad 提供的答案解决了所有情况,而无需编写额外的代码!
    • @NeelamVerma 那么您需要接受 Amin Negm-Awad 的回答。干杯!
    • @VinayakKini 谢谢你的好意和赞赏:)
    【解决方案2】:

    您可以为此使用 NSExpression:

    NSExpression *expression = [NSExpression expressionWithFormat:@"1+2"];
    NSLog(@"%@", [expression expressionValueWithObject:nil context:nil]);
    

    有关更多信息,请阅读所用方法的文档。

    【讨论】:

    • 谢谢哥们真棒的回答!
    • +1 这是正确的。除非您在解析/评估过程中需要更大的灵活性,否则您不需要像我的 DDMathParser 这样的东西。
    【解决方案3】:

    使用这个:

    NSString * str =@"1+2";
    
    NSArray *arr = [str componentsSeparatedByString:@"+"];
    int sum = 0;
    for (int i = 0; i < [arr count]; i++) {
        sum += [[arr objectAtIndex:i] intValue];
    }
    NSLog(@"sum : %d",sum); 
    

    输出:总和 = 6

    您也可以使用NSExpression。

    表达式是谓词实现的核心。当 expressionValueWithObject: 被调用时,表达式被计算,并返回一个值,然后可以由操作符处理。表达式可以是从常量到方法调用的任何东西。标量应该包装在适当的 NSValue 类中。

    例子:

        NSLog(@"sum : %@", [[NSExpression expressionWithFormat:@"1+4"] expressionValueWithObject:nil context:nil]);
    Output :- sum : 5
        NSLog(@"mulitple : %@", [[NSExpression expressionWithFormat:@"2*4"] expressionValueWithObject:nil context:nil]);
    Output :- mulitple : 8
    

    希望对你有帮助。

    【讨论】:

      【解决方案4】:

      如果您的数学表达式足够简单,您可以按照 Rajan Balana 的建议走手动路线。

      要评估更复杂的表达式,您可以将NSPredicate 与NSExpression 结合使用/滥用,如本博文所述:http://funwithobjc.tumblr.com/post/1553469975/abusing-nspredicate

      请注意,NSPredicate 仅在您的输入确实是一个方程式(包括右侧部分)时才需要:

      NSPredicate* parsedExpression = [NSPredicate predicateWithFormat:@"1+2=x"];
      NSExpression* leftPart = [(NSComparisonPredicate*)parsedExpression leftExpression];
      NSNumber* evaluatedResult = [leftPart expressionValueWithObject:nil context:nil];
      NSLog(@"Expr:%@", evaluatedResult);
      

      要实现正确的解析,您可以使用其中一种用于 Objective-C 的数学解析器。我自己没用过,不过好像比较流行的

      【讨论】:

        【解决方案5】:

        我认为您需要 subString 您的字符串,并将每个数字存储在新的 NSstring(integerValue) 或 Integer 变量中。

        示例:

        NSString *str = @"1+2";
            int x = [[str substringToIndex:1]integerValue];
            int y = [[str substringFromIndex:1]integerValue];
            int z = x+y;
            NSLog(@"Sum === %d",z);
        

        【讨论】:

          【解决方案6】:

          取决于输入字符串方程的复杂性。您可以使用Shunting-yard algorithm 解析数学方程,然后从Abstract Syntact Tree (AST) 计算方程

          但我希望您正在寻找一些简单的,最好是已经完成的解决方案。在这种情况下,您可以尝试其中的一种(不能保证,我没有尝试过,只是在谷歌上搜索过):

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-20
            • 1970-01-01
            • 1970-01-01
            • 2023-03-29
            相关资源
            最近更新 更多