NSExpression 1/2(NSExpression 1/2)

2019-07-18 06:34发布

我要计算一个字符串,我这个做:

NSExpression *expression = [NSExpression expressionWithFormat:calculationString];
float result = [[expression expressionValueWithObject:nil context:nil] floatValue];
NSLog(@"%f", result);

问题是,当calculationstring为1/2,结果为0。我试图f控制双和NSNumber的并且%改变浮子%f和%@,但我总是只得到0.1什么我要改变?

此外,如果它很重要,我在欧洲,所以我有逗号,而不是为这个价值点,但我与%F这表明它作为点记录它不应该的问题。 只是为了信息

Answer 1:

打字NSExpression很像C:文字看起来像整数(没有小数点/逗号)被视为整数,因此使用整数除法。 (主管整数除法,1/2 零。如果你想0.5,则无需浮点除法。)当表达式进行解析和评估,因此试图改变结果的类型或输出的格式没有发生这种情况效果 - 那些东西解析和评估后发生。

如果您calculationString完全是你的控制之下,很容易以确保您使用浮点字面任何你想要的浮点除法。 (也就是说,使用1.0/2 ,而不是1/2 )。如果没有,你需要改变它,使得它-在这里它可能更好地分解解析NSExpression和更改操作,而不是Munge时间的字符串。


跟帖编辑的“分解”位:在内容字符串改写(munging),你知道有没有高次结构一般是有问题的 。 并与NSExpression ,你已经有了一个解析器(谁的不是一个简单的正则表达式更聪明)分解字符串你-这实际上是在什么NSExpression是怎么一回事。

所以,如果你正在使用用户提供的字符串的工作,不要试图通过改变字符串改变的表达。 让NSExpression解析它,然后使用所得到的对象的属性,以开接它成其组成的表达式。 如果你的字符串是简单的“1/2”,那么你的表达有两个数组arguments和功能"divide:by:" -你可以用等效功能,其中的参数之一是明确浮点值替换:

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
        }
    }
}


Answer 2:

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

1.0/2
1.0/2.0
1/2.0

将所有工作



Answer 3:

我认为你需要用户DDMathParser哪一个是最好在这种情况下。 我在我的一个项目,该项目正面临着同样的问题,把它作为你所面临

DDMathEvaluator *eval = [DDMathEvaluator defaultMathEvaluator]; id value=[eval evaluateString:@"1/2" withSubstitutions:nil error:&error]; NSLog(@"Result %@",value); Result 0.5



文章来源: NSExpression 1/2