1

我正在制作一个计算器,它在名为“inputLabel”的标签中记录输入,然后在名为“outputLabel”的不同标签中输出答案(类似于图形计算器)。一旦用户完成输入表达式,表达式将存储在一个 NSString 对象,然后用 NSPredicate 类解析并用 NSExpression 类评估。我有什么工作,但我注意到对于特定操作,答案不正确。例如,如果用户输入“25/2”计算器返回 12,这显然是不正确的。但是,如果用户输入“25/2.0”或“25.0/2”,则计算器返回 12.5,这就是我想要的。似乎 NSExpression 方法 'expressionValueWithObject' 将操作数解释为整数而不是浮点数。如果是这种情况,有没有办法改变'expressionValueWithObject'方法来将操作数解释为浮点数?

大脑.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];
}

视图控制器.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];
}
4

2 回答 2

1

不,NSExpression不能那样做。您可以尝试在评估字符串之前将“.0”附加到字符串中的所有整数,但更好的解决方案可能是使用“正确”的数学表达式解析器,例如 https://github.com/davedelong/DDMathParser

于 2013-11-05T06:11:09.410 回答
0

您可以遍历表达式树,将表达式替换为整数值 (expressionType == NSConstantExpression)。这取决于您的计算器的一些功能,无论它是否值得。

于 2013-11-05T11:12:22.937 回答