'expressionValueWithObject'方法可以将数字解释为浮点数而不是整数吗?

时间:2013-11-05 04:37:44

标签: objective-c

我正在制作一个计算器,用于在名为“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];
}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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