Преобразование строки с математическими выражениями в число с плавающей запятой

Текстовое поле содержит математические выражения, такие как: 12+45-6 Можно ли преобразовать эту строку в число?

Можем ли мы использовать предикат?

NSString *foo = @"((a*b)/c+(d/5))+15";
// dummy predicate that contains our expression
NSPredicate *pred = [NSPredicate predicateWithFormat:[foo stringByAppendingString:@" == 42"]];
NSExpression *exp = [pred leftExpression];
NSNumber *result = [exp expressionValueWithObject:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:4], @"a",[NSNumber numberWithInt:7], @"b",[NSNumber numberWithInt:2], @"c",[NSNumber numberWithInt:20], @"d",nil]context:nil];
NSLog(@"%@", result); // logs "33"<br/>

Я также нашел это https://github.com/unixpickle/ANExpressionParser


person Community    schedule 24.07.2011    source источник
comment
Просто к вашему сведению - это обсуждение тоже продолжается: =" очень быстрая оценка математического выражения с целью c"> stackoverflow.com/questions/6809655/   -  person Monolo    schedule 25.07.2011
comment
Пожалуйста, отправьте код, который не одобряется здесь, в SO. Просто говорю'.   -  person Seva Alekseyev    schedule 25.07.2011
comment
Возможный дубликат stackoverflow.com/questions/4892152/   -  person lhf    schedule 25.07.2011


Ответы (4)


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

person Marcelo Cantos    schedule 24.07.2011
comment
спасибо за помощь ^^, не могли бы вы дать ссылку на пример проекта xcode, пожалуйста? - person ; 25.07.2011
comment
Страница, на которую я ссылаюсь, предоставляет реализацию C. Я не знаю, где вы найдете готовый проект XCode для этого. Если это звучит как слишком тяжелая работа (это скорее проект на пару часов, чем быстрое упражнение по сборке «Лего»), тогда вам следует использовать встроенный движок JavaScript, хотя это влечет за собой запуск веб-сайта. управление браузером, что является довольно тяжелым решением. - person Marcelo Cantos; 25.07.2011

Вам нужно проанализировать этот ввод с помощью синтаксического анализатора, а затем оценить его. Я слышал о людях, успешно использующих для этого muParser, чтобы избавить вас от написания всего этого самостоятельно. Проверьте это. http://muparser.sourceforge.net/

person Stephan van den Heuvel    schedule 24.07.2011
comment
спасибо за помощь ^^, не могли бы вы дать ссылку на пример проекта xcode, пожалуйста? - person ; 25.07.2011
comment
Я бы хотел, чтобы каждая проблема сопровождалась примером проекта xcode, лол. Это библиотека c, вам придется разобраться с ней самостоятельно, друг мой. - person Stephan van den Heuvel; 25.07.2011

да. Почитайте про "вычисление выражений" или воспользуйтесь готовым интерпретатором скриптов. JavaScript доступен для всех программ iOS как часть WebView.

person Seva Alekseyev    schedule 24.07.2011
comment
Работает, но я не думаю, что эта простота стоит ужасной производительности. - person ; 25.07.2011
comment
спасибо за помощь ^^, не могли бы вы дать ссылку на пример проекта xcode, пожалуйста? - person ; 25.07.2011

Да, конечно, это возможно.

Вам следует изучить преобразование инфикса в постфикс с помощью стека: http://scriptasylum.com/tutorials/infix_postfix/algorithms/infix-postfix/index.htm

А затем посмотрите, как оценить выражение postix, также используя стек: http://scriptasylum.com/tutorials/infix_postfix/algorithms/postfix-evaluation/index.htm

person Paul    schedule 24.07.2011
comment
спасибо за помощь ^^, не могли бы вы дать ссылку на пример проекта xcode, пожалуйста? - person ; 25.07.2011