Преобразовать NSString математического уравнения в значение

Я хотел бы знать, как оценить строковое представление уравнения, как если бы оно было реальным уравнением:

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

Я хочу вернуть "ложь", потому что 15+14 не равно 23. Как я могу заставить это работать?

3 ответа

Решение

Вот пример, как это сделать с 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,

Таким образом, это проблема, которая, как мне кажется, намного сложнее, чем позволяет связанный вопрос (хотя вопрос требует "простого" синтаксического анализатора уравнений).

К счастью для вас, я думаю, что это действительно интересная проблема, и она уже написана для вас: DDMathParser,

Он содержит большое количество документации, в том числе такие, как, как добавить ее в ваш проект, и обзор его возможностей. Он поддерживает все стандартные математические операторы, включая логические и операторы сравнения (||, &&, ==, !=, <=, так далее).

В вашем случае вы бы сделали что-то вроде этого:

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

Как головы, DDMathParser предоставляется по лицензии MIT, которая требует, чтобы вы включали информацию об авторских правах и полный текст лицензии во все, что ее использует.

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); 
Другие вопросы по тегам