因为我注意到Float
和CGFloat
在32位和64位设备上的行为不同,这可能导致错误,我尝试替换所有Float
我的项目中包含CGFloat
的值。但是,我无法找到一种方法将CGfloat
值截断为小数点后的2位数。
在我的项目中,我有一个函数,下载文件返回Float
值"进度"不断地,表明已经下载了多少百分比的文件,这通常类似于" 0.3942183693039206"。在这种情况下,我需要将数字截断为" 0.39"所以我可以更新UI,这是我的功能:
func updatePropertiesForPorgress(progress:CGFloat){
dispatch_async(dispatch_get_main_queue(), { () -> Void in
let truncated = NSString(format: "%.2f", progress)
let float = truncated.floatValue
self.progressTileView.rating = CGFloat(float)
})
}
它与Float
值完美匹配,但如果我将进度作为CGFloat
值传递,则截断的变量将等于" 0.00":
出于好奇,我试图在操场上复制这种情况,并成功地做到了。代码简单如下:
var test:CGFloat = 0.3920394829459
let truncated = NSString(format: "%.2f", test)
let float = truncated.floatValue
会有不同的输出,具体取决于" test"变量是Float
或CGFloat
值。如果"测试"是一个Float
值,结果是0.39,这是正确的,但如果我将其更改为CGFloat
,结果将是" 0.00"。
任何人都可以帮助我了解正在发生的事情,并告诉我如何正确截断CGFloat
值吗?我试过NSNumberFormatter
,但它现在没有用。
谢谢!
答案 0 :(得分:4)
NSString(format:_: ...)
接受CVarArgType
s:
extension NSString {
convenience init(format: NSString, _ args: CVarArgType...)
但是,从Swift 1.1开始,CGFloat
本身并不符合CVarArgType
。传递到NSString(format:_: ...)
后,它会转换为NSNumber
。
因此NSString(format: "%.2f", test)
相当于NSString(format: "%.2f", test as NSNumber)
。因此,%.2f
将是0.00
您应该明确地将其转换为Double
:
NSString(format: "%.2f", Double(test))
请注意:从Swift 1.2开始,由于CGFloat
符合CVarArgType
,因此您的代码可以按原样运行。