2013-05-28 1 views

ответ

30

Вы можете использовать NSExpression для этого:

NSExpression *expression = [NSExpression expressionWithFormat:@"1+2"]; 
NSLog(@"%@", [expression expressionValueWithObject:nil context:nil]); 

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

+0

Спасибо, друг! Ответ! –

+0

Добро пожаловать. –

+3

+1 Это правильно. Вам не нужно что-то вроде моего DDMathParser, если вам не нужна большая гибкость в процессе синтаксического анализа/оценки. –

0

Что вы можете сделать, вы можете получить компоненты строки, разделенные знаком «+», используя этот метод, а затем вы получите массив компонентов, то есть 1,2.

NSArray* foo = [str componentsSeparatedByString: @"+"];

int result = [[foo objectAtIndex:0] integerValue] + [[foo objectAtIndex:1] integerValue];

, а затем вы можете использовать целочисленное значение для этих двух элементов и добавить их и сохранить результат в переменном целом.

+1

что вы будете делать, если '*' вместо '+' ?? –

+0

@Anil замените это + на * :) –

+0

Что делать, если у вас есть +, -, * все в выражении вроде 1 + 2 * 3-5 ??? –

1

Используйте это:

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); 

Вывод: сумма = 6

Вы можете использовать NSExpression также.

Выражения являются основой реализации предиката. Когда вызывается выражение expressionValueWithObject:, выражение вычисляется и возвращается значение, которое затем может обрабатываться оператором. Выражения могут быть любыми: от констант до вызовов метода. Скалары должны быть обернуты в соответствующие классы 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 

Надеется, что это помогает.

2

Если ваши математические выражения достаточно просты, вы можете пойти по ручному маршруту, как это предложил Раджан Балана.

Для оценки более сложных выражений, вы можете использовать/злоупотребления 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 там.Я не использовал их сам, но популярные из них, кажется,

0

Я думаю, что вам нужно 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); 
0

В зависимости от сложности ваших входных строк уравнений. Вы можете использовать Shunting-yard algorithm для анализа математических уравнений, а затем вычислить уравнение из Abstract Syntact Tree (AST)

Но я ожидаю, что вы ищете какое-то простое, желательно уже готовое решение. В этом случае вы можете взять попробовать один из них (без гарантии, я не пробовал те, только гугл):