我要计算一个字符串,我这个做:
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这表明它作为点记录它不应该的问题。 只是为了信息
打字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
}
}
}
我认为你需要用户DDMathParser哪一个是最好在这种情况下。 我在我的一个项目,该项目正面临着同样的问题,把它作为你所面临
DDMathEvaluator *eval = [DDMathEvaluator defaultMathEvaluator]; id value=[eval evaluateString:@"1/2" withSubstitutions:nil error:&error]; NSLog(@"Result %@",value); Result 0.5