Есть ли способ решить строковые уравнения в ios
?
Например
Input:
NSString * str [email protected]"1+2";
Вывод:
NSInteger result = 3
//i.e сумма 1 + 2 из str
Как это сделать и получить ожидаемый результат!
Пожалуйста, помогите!
Есть ли способ решить строковые уравнения в ios
?
Например
Input:
NSString * str [email protected]"1+2";
Вывод:
NSInteger result = 3
//i.e сумма 1 + 2 из str
Как это сделать и получить ожидаемый результат!
Пожалуйста, помогите!
Вы можете использовать NSExpression для этого:
NSExpression *expression = [NSExpression expressionWithFormat:@"1+2"];
NSLog(@"%@", [expression expressionValueWithObject:nil context:nil]);
Для получения дополнительной информации ознакомьтесь с документацией по используемым методам.
Если ваши математические выражения достаточно просты, вы можете пойти по ручному маршруту, как это предложил Раджан Балана.
Чтобы оценить более сложные выражения, вы можете использовать /abuse 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. Я не использовал их сам, но популярные, кажется,
Используйте это:
NSString * str [email protected]"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);
Выход: sum = 6
Вы также можете использовать NSExpression.
Выражения являются ядром реализации предиката. Когда вызывается выражениеValueWithObject:, выражение оценивается и возвращается значение, которое затем может обрабатываться оператором. Выражения могут быть любыми: от констант до вызовов метода. Scalaры должны быть обернуты в соответствующие классы 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
Надеюсь, это поможет вам.
Что вы можете сделать, вы можете получить компоненты строки, разделенные знаком "+", используя этот метод, а затем вы получите массив компонентов, то есть 1,2.
NSArray* foo = [str componentsSeparatedByString: @"+"];
int result = [[foo objectAtIndex:0] integerValue] + [[foo objectAtIndex:1] integerValue];
а затем вы можете использовать целочисленное значение для этих двух элементов и добавить их и сохранить результат в целочисленной переменной.
Я думаю, вам нужно 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);
Зависит от сложности ваших уравнений входной строки. Вы можете использовать алгоритм Shunting-yard для анализа математических уравнений, а затем вычислить уравнение из Abstract Syntact Tree (AST)
Но я ожидаю, что вы ищете небольшое, желательно уже готовое решение. В этом случае вы можете попробовать один из них (нет гарантии, я не пробовал эти, просто googled):