将数学方程的NSString转换为值

时间:2011-12-23 15:56:23

标签: objective-c cocoa cocoa-touch nsstring expression-evaluation

我想知道如何评估方程的字符串表示,就像它是一个真实的方程式一样:

if(@"15+14==23")
{
    //True statement...
}
else
{
    //False statement....
}

我想返回“false”,因为15 + 14不等于23.我怎样才能让它工作?

3 个答案:

答案 0 :(得分:7)

以下是如何使用NSPredicate执行此操作的示例:

NSPredicate *p = [NSPredicate predicateWithFormat:@"1+2==3"];
NSLog(@"%d", [p evaluateWithObject:nil]);
p = [NSPredicate predicateWithFormat:@"1+2==4"];
NSLog(@"%d", [p evaluateWithObject:nil]);

第一个NSLog生成1,因为1+2==3为真;第二个产生0

答案 1 :(得分:3)

所以,这是一个我认为比链接问题复杂得多的问题(虽然问题是要求一个“简单的”方程解析器)。

幸运的是,我认为这是一个非常有趣的问题,并且已经为您编写了一个:DDMathParser

它有一个good amount of documentation,包括how to add it to your projecthigh overview of its capabilities之类的内容。它支持all of the standard mathematical operators,包括逻辑和比较运算符(||&&==!=<=等。

在你的情况下,你会做这样的事情:

NSNumber *result = [@"15+14 == 23" numberByEvaluatingString];
if ([result boolValue] == YES) {
  ....True statement....
} else {
  .....False statement.....
}

作为一个提醒,DDMathParser根据MIT许可提供,这要求您在使用它的任何内容中包含版权信息和许可的全文。

答案 2 :(得分:0)

NSString *equation = @"15+14==29";


NSPredicate *pred = [NSPredicate predicateWithFormat:equation];

NSExpression *LeftExp = [pred leftExpression];

NSExpression *RightExp = [pred rightExpression];    


NSNumber *left = [LeftExp expressionValueWithObject:nil context:nil];

NSNumber *right = [RightExp expressionValueWithObject:nil context:nil];


if ([left isEqualToNumber:right]) {
    NSLog(@"yes left is equal to right");
}
else{
    NSLog(@"yes left is NOT equal to right");

}

NSLog(@"left %@", left); 

NSLog(@"right %@", right);