Преобразовать 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);