我正在制作一个计算器,用于在名为“inputLabel”的标签中记录输入,然后在名为“outputLabel”的不同标签中输出答案(类似于图形计算器)。一旦用户完成输入表达式,表达式存储在NSString对象中,然后使用NSPredicate类进行解析并使用NSExpression类进行求解。我的工作原理,但我注意到特定操作的答案不正确。例如,如果用户键入“25/2” “计算器返回12,这显然是不正确的。但是,如果用户键入”25 / 2.0“或”25.0 / 2“,计算器将返回12.5,这就是我想要的。似乎NSExpression方法'expressionValueWithObject'正在解释操作数是整数而不是浮点数。如果是这种情况,有没有办法改变'expressionValueWithObject'方法将操作数解释为浮点数?
Brain.m
-(float)performCalculation: (NSString *)operation
{
NSPredicate *parsed = [NSPredicate predicateWithFormat:[operation stringByAppendingString:@"=1.0"]];
NSExpression *inputExpressionParsed = [(NSComparisonPredicate *)parsed leftExpression];
NSNumber *result = [inputExpressionParsed expressionValueWithObject:inputExpressionParsed context:nil];
return [result floatValue];
}
ViewController.m
- (IBAction)equalsPressed:(id)sender
{
//self.inputLabel.text = [self.inputLabel.text stringByAppendingString:@".0"];
NSString *inputExpression = self.inputLabel.text;
self.inputLabel.text = [self.inputLabel.text stringByAppendingString:@"="];
float result = [self.brain performCalculation:inputExpression];
self.outputLabel.text = [NSString stringWithFormat:@"%g", result];
}
答案 0 :(得分:1)
不,NSExpression
不能这样做。您可以尝试将“.0”附加到所有整数
在评估之前在字符串中,但更好的解决方案可能是使用“适当的”
例如,数学表达式解析器
https://github.com/davedelong/DDMathParser
答案 1 :(得分:0)
您可以迭代表达式树,用整数值替换表达式(expressionType == NSConstantExpression)。这取决于你的计算器的一些功能,无论它是否值得。