我想要计算一个字符串,我是这样做的:
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记录,它显示为点。仅供参考
发布于 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:"函数组成的数组-你可以用一个等价的函数替换它,其中一个参数是显式的浮点值:
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
}
}
}发布于 2013-01-16 04:24:21
基本上,你只需要告诉它你正在执行浮点运算,
1.0/2
1.0/2.0
1/2.0一切都会正常吗?
发布于 2014-05-19 13:15:57
我认为你需要使用在这种情况下最好的DDMathParser。我已经在我的一个项目中使用了它,该项目面临着与您相同的问题。
`DDMathEvaluator *eval = [DDMathEvaluator defaultMathEvaluator]; id value=[eval evaluateString:@"1/2" withSubstitutions:nil error:&error]; NSLog(@"Result %@",value); Result 0.5`https://stackoverflow.com/questions/14346056
复制相似问题