NSString到方程

时间:2009-10-01 04:52:34

标签: iphone objective-c

我正在使用Objective-C,我正在尝试设置一个存储在NSString中的等式,以进行评估并存储在NSInteger中。

类似于以下内容:

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

然后将其评估为31并将其存储到NSInteger。任何想法如何做到这一点?

3 个答案:

答案 0 :(得分:22)

你想要apptree.net上的精彩,神奇,美妙的GCMathParser(免费!):http://apptree.net/parser.htm它完全符合您的要求,甚至允许您进行变量替换(3x + 42,用x = 7评估。它甚至支持数学函数,如sin(),cos(),tan(),它们的反转,dtor(),log(),....

很久以后

编辑 ......

虽然GCMathParser非常棒,但它具有不可扩展的缺陷。因此,如果您需要一个本身不支持的功能,那就太糟糕了。所以我决定对它做点什么,并提出了一个完全原生的数学解析器和评估器:http://github.com/davedelong/DDMathParser

答案 1 :(得分:19)

您可以使用谓词系统:

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"

答案 2 :(得分:7)

我在iPhone上使用它来评估等式。它更简单,你不需要创建NSPredicate,只需要NSExpression:

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

以下是兼容的可解析函数的文档:“BNF Definition of Cocoa Predicates”

在Gist here

中共享的

代码