objective-c – NSExpression 12

objective-c – NSExpression 12,第1张

概述我想计算一个字符串,我正在这样做: NSExpression *expression = [NSExpression expressionWithFormat:calculationString];float result = [[expression expressionValueWithObject:nil context:nil] floatValue];NSLog(@"%f", res 我想计算一个字符串,我正在这样做:

NSExpression *Expression = [NSExpression ExpressionWithFormat:calculationString];float result = [[Expression ExpressionValueWithObject:nil context:nil] floatValue];NSLog(@"%f",result);

问题是,当calculatetring为1/2时,结果为0.我试图将double和NSNumber以及%f更改为%f和%@,但我总是得到0.我需要更改什么?

此外,如果它很重要,我在欧洲,所以我有逗号而不是这个值的分数,但它应该无关紧要,因为我使用%f记录它作为点.仅供参考

解决方法 在NSExpression中输入非常类似于C:看起来像整数的文字(没有小数点/逗号)被视为整数,因此使用整数除法. (在整数除法下,1/2为零.如果需要0.5,则需要浮点除法.)当解析和计算表达式时会发生这种情况,因此尝试更改结果的类型或输出的格式没有效果 – 解析和评估后会发生这些事情.

如果您的calculateString完全在您的控制之下,则可以轻松确保在任何需要浮点除法的位置使用浮点文字. (也就是说,使用1.0 / 2而不是1/2.)如果没有,你需要改变它,这样做 – 在这里分解解析的NSExpression并更改 *** 作数而不是munge字符串可能更好.

关于“分解”位的后续编辑:在你知道具有高阶结构的内容中的字符串munging通常是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        }    }}
总结

以上是内存溢出为你收集整理的objective-c – NSExpression 1/2全部内容,希望文章能够帮你解决objective-c – NSExpression 1/2所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1032996.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存