Convert a string with mathematical expressions into a float
Asked Answered
C

4

0

A text field contains mathematical expressions like: 12+45-6 Is possible to convert this string to a number?

Can we use the predicate facility?

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/>

I also found this https://github.com/unixpickle/ANExpressionParser

Canaletto answered 24/7, 2011 at 21:40 Comment(3)
Just FYI - there is this discussion going on, too: #6810155Ayers
"Please send the codez" is frowned upon here at SO. Just sayin'.Dactylogram
Possible duplicate of #4892652Koslo
J
2

One solution that doesn't rely on external libraries is to first convert the string into a sequence of tokens, then evaluate the expression using the shunting-yard algorithm chained onto a simple stack machine.

Jerriejerrilee answered 24/7, 2011 at 21:47 Comment(2)
thanks for the help ^^, can you give a link to a sample xcode project please?Canaletto
The page I linked to provides a C implementation. I don't know that you'll find a pre-baked XCode project for this anywhere. If this sounds like too much hard work (it's more a couple-of-hours project than a quick snap-the-lego-together exercise), then you should use the built-in JavaScript engine, though that entails firing up the a web browser control, which is quite a heavyweight solution.Jerriejerrilee
B
1

You need to parse this input using a parser then evaluate it. I have heard of people having success using muParser for this, to save you writing it all yourself. Check it out. http://muparser.sourceforge.net/

Bistort answered 24/7, 2011 at 21:51 Comment(2)
thanks for the help ^^, can you give a link to a sample xcode project please?Canaletto
I wish every problem came with a sample xcode project, lol. It is a c library, you are going to have to figure it out yourself my friend.Bistort
D
0

Yes. Read up on "expression evaluation", or use a ready-made script interpreter. JavaScript is available to all iOS programs as a part of WebView.

Dactylogram answered 24/7, 2011 at 21:47 Comment(2)
Works, but I don't think this simplicity is worth the terrible performance.Epiphragm
thanks for the help ^^, can you give a link to a sample xcode project please?Canaletto
Q
0

Yes, of course it's possible.

You should look into infix to postfix conversion using a stack: http://scriptasylum.com/tutorials/infix_postfix/algorithms/infix-postfix/index.htm

And then look into how to evaluate a postix expression, also using a stack: http://scriptasylum.com/tutorials/infix_postfix/algorithms/postfix-evaluation/index.htm

Queenie answered 24/7, 2011 at 21:51 Comment(1)
thanks for the help ^^, can you give a link to a sample xcode project please?Canaletto

© 2022 - 2024 — McMap. All rights reserved.