我正在使用Objective-C,我正在尝试设置一个存储在NSString
中的等式,以进行评估并存储在NSInteger
中。
类似于以下内容:
equation = [[NSString alloc] initWithString:@"1+5*6"];
然后将其评估为31并将其存储到NSInteger
。任何想法如何做到这一点?
答案 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 中共享的代码