如何从 NSExpression 的 expressionValueWithObject:context 方法中获取浮点数?

Posted

技术标签:

【中文标题】如何从 NSExpression 的 expressionValueWithObject:context 方法中获取浮点数?【英文标题】:How to get floating point number from the NSExpression's expressionValueWithObject:context method? 【发布时间】: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。

【问题讨论】:

在 Objective-C 中,异常是为编程错误保留的,而不是控制流。 比较***.com/questions/14346056/nsexpression-1-2. 一种选择是传入浮点数:“5.0/2.0”。 【参考方案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 对象。

【讨论】:

以上是关于如何从 NSExpression 的 expressionValueWithObject:context 方法中获取浮点数?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 NSExpression 获取 NSManagedObject?

如何从 NSExpression 的 expressionValueWithObject:context 方法中获取浮点数?

如何从 NativeScript 调用 Objective-C NSExpression(format: ....)?

如何使用 NSExpression 使用自定义函数设置 NSFetchRequest propertiesToFetch

如何使 NSExpression 的 expressionForFunction:withArguments: 尊重获取请求的谓词

我可以强制 NSExpression 和 expressionValue 以某种方式假设 Doubles 而不是 Ints 吗?