5

我已经实现了一个自定义计算器,我在其中使用以下代码来评估算术表达式,例如 5+3*5-3。

- (NSNumber *)evaluateArithmeticStringExpression:(NSString *)expression {

    NSNumber *calculatedResult = nil;

    @try {
        NSPredicate * parsed = [NSPredicate predicateWithFormat:[expression stringByAppendingString:@" = 0"]];
        NSExpression * left = [(NSComparisonPredicate *)parsed leftExpression];
        calculatedResult = [left expressionValueWithObject:nil context:nil];
    }
    @catch (NSException *exception) {

        NSLog(@"Input is not an expression...!");
    }
    @finally {

        return calculatedResult;
    }
}

但是,当我有除法运算的整数时,结果我只得到整数。假设 5/2 我得到 2 结果。由于整数除法,它适合编程的震动。

但我需要浮点结果。

我怎样才能得到它而不是扫描表达式字符串并将整数除数替换为浮点数。在我们的示例中为 5/2.0 或 5.0/2。

4

1 回答 1

9

我自己找到的。

- (NSNumber *)evaluateArithmeticStringExpression:(NSString *)expression {

    NSNumber *calculatedResult = nil;

    @try {
        NSPredicate * parsed = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"1.0 * %@ = 0", expression]];
        NSExpression * left = [(NSComparisonPredicate *)parsed leftExpression];
        calculatedResult = [left expressionValueWithObject:nil context:nil];
    }
    @catch (NSException *exception) {

        NSLog(@"Input is not an expression...!");
    }
    @finally {

        return calculatedResult;
    }
}

它只是以操作数“1.0 *”开始表达式,然后一切都将是浮点计算。

NSPredicate * parsed = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"1.0 * %@ = 0", expression]];

注意:谢谢@Martin R,但是,我的问题不是关于整数除法,而是完全关于 NSExpression。我在最后一句话中明确排除了。

@Zaph,这里使用异常处理是有充分理由的。这是我的方法接受用户输入的地方,如果用户可以输入 w*g 之类的内容,并且 - expressionValueWithObject: context: 将引发异常,我必须避免我的应用程序异常终止。如果用户输入了一个有效的表达式,那么他/她将得到一个 NSNumber 形式的答案,否则一个 nil NSNumber 对象。

于 2014-05-28T12:46:08.447 回答