NSString к уравнению - PullRequest
       16

NSString к уравнению

8 голосов
/ 01 октября 2009

Я использую Objective-C и пытаюсь установить уравнение, которое хранится в NSString, для оценки и сохранения в NSInteger.

что-то похожее на следующее:

equation = [[NSString alloc] initWithString:@"1+5*6"];

, а затем оцените его как 31 и сохраните в NSInteger. есть идеи как это сделать?

Ответы [ 3 ]

22 голосов
/ 01 октября 2009

Вам нужен замечательный, удивительный и невероятный GCMathParser, доступный (БЕСПЛАТНО!) На apptree.net: http://apptree.net/parser.htm Он делает именно то, что вы просите, и даже позволяет выполнять переменные замены (3x +42, оценка с х = 7). Он даже поддерживает математические функции, такие как sin (), cos (), tan (), их инверсии, dtor (), log (), ....

редактировать долгое время спустя ...

Хотя GCMathParser довольно крутой, у него есть недостаток - он не расширяемый. Так что если вам нужна функция, которую она не поддерживает изначально, то это тоже плохо. Поэтому я решил что-то с этим сделать и придумал полностью собственный математический анализатор и оценщик: http://github.com/davedelong/DDMathParser

19 голосов
/ 01 октября 2009

Вы можете использовать систему предикатов:

NSString *equation = @"1+5*6";

// dummy predicate that contains our expression
NSPredicate *pred = [NSPredicate predicateWithFormat:
                      [equation stringByAppendingString:@" == 42"]];
NSExpression *exp = [pred leftExpression];
NSNumber *result = [exp expressionValueWithObject:nil context:nil];
NSLog(@"%@", result); // logs "31"
7 голосов
/ 14 апреля 2012

Я использую это на iPhone, чтобы оценить уравнение. Это проще, вам не нужно создавать NSPredicate, просто NSExpression:

NSString *equation = @"floor((19-10)/2)";
NSNumber *result = [NSExpression expressionWithFormat:equation];
NSLog(@"%@", result); // logs "4"

А вот документы для совместимых разбираемых функций: «Определение предикатов какао BNF»

код в Gist здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...