【问题标题】:How to get floating point number from the NSExpression's expressionValueWithObject:context method?如何从 NSExpression 的 expressionValueWithObject:context 方法中获取浮点数?
【发布时间】:2014-05-27 14:28:35
【问题描述】:

我已经实现了一个自定义计算器,我在其中使用以下代码来计算算术表达式,例如 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。

【问题讨论】:

标签: ios objective-c floating-point nsexpression


【解决方案1】:

我自己找到的。

- (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 对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多