首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSExpression 1/2

NSExpression 1/2
EN

Stack Overflow用户
提问于 2013-01-16 04:14:33
回答 5查看 1.8K关注 0票数 2

我想要计算一个字符串,我是这样做的:

代码语言:javascript
复制
NSExpression *expression = [NSExpression expressionWithFormat:calculationString];
float result = [[expression expressionValueWithObject:nil context:nil] floatValue];
NSLog(@"%f", result);

问题是,当calculationstring为1/2时,结果为0。我尝试使用double和NSNumber将float和%f更改为%f和%@,但我总是只得到0。我必须改变什么?

另外,如果重要的话,我在欧洲,所以我对这个值使用逗号而不是点,但这不应该有关系,因为我用%f记录,它显示为点。仅供参考

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-01-16 04:30:03

NSExpression中的类型很像C中的类型:看起来像整数(没有小数点/逗号)的文字被视为整数,因此使用整数除法。(整数除法时,1/2为零。如果你想要0.5,你需要浮点除法。)这是在解析和计算表达式时发生的,因此尝试更改结果的类型或输出的格式没有任何影响--这些事情在解析和计算之后发生。

如果您的calculationString完全在您的控制之下,那么很容易确保在您想要进行浮点除法的任何地方都使用浮点文字。(即,使用1.0/2而不是1/2。)如果不是,则需要对其进行更改--在这里,分解已解析的NSExpression并更改操作数可能比使用字符串更好。

对“分解”位的后续编辑:您知道具有高阶结构的内容中的字符串转换通常是problematic。使用NSExpression,您已经有了一个解析器(它比简单的正则表达式更聪明),它可以为您分解字符串--这实际上就是NSExpression的全部功能。

因此,如果您正在使用用户提供的字符串,请不要试图通过更改字符串来更改表达式。让NSExpression解析它,然后使用结果对象的属性将其拆分成其组成表达式。如果你的字符串仅仅是"1/2",那么你的表达式有一个由两个arguments"divide:by:"函数组成的数组-你可以用一个等价的函数替换它,其中一个参数是显式的浮点值:

代码语言:javascript
复制
extension NSExpression {
    var floatifiedForDivisionIfNeeded: NSExpression {
        if function == "divide:by:", let args = arguments, let last = args.last,
          let firstValue = args.first?.constantValue as? NSNumber {
            let newFirst = NSExpression(forConstantValue: firstValue.doubleValue)
            return NSExpression(forFunction: function, arguments: [newFirst, last])
        } else {
            return self
        }
    }
}
票数 2
EN

Stack Overflow用户

发布于 2013-01-16 04:24:21

基本上,你只需要告诉它你正在执行浮点运算,

代码语言:javascript
复制
1.0/2
1.0/2.0
1/2.0

一切都会正常吗?

票数 3
EN

Stack Overflow用户

发布于 2014-05-19 13:15:57

我认为你需要使用在这种情况下最好的DDMathParser。我已经在我的一个项目中使用了它,该项目面临着与您相同的问题。

代码语言:javascript
复制
`DDMathEvaluator *eval = [DDMathEvaluator defaultMathEvaluator];    id value=[eval evaluateString:@"1/2" withSubstitutions:nil error:&error];    NSLog(@"Result %@",value);    Result 0.5`
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14346056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档