Преобразовать NSString математического уравнения в значение - PullRequest
7 голосов
/ 23 декабря 2011

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

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

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

Ответы [ 3 ]

7 голосов
/ 23 декабря 2011

Вот пример того, как это сделать с 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 имеет значение true;второй производит 0.

3 голосов
/ 23 декабря 2011

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

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

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

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

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

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

0 голосов
/ 23 декабря 2011
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); 
...