如何截断CGFloat值?
因为我注意到Float
和CGFloat
在32位和64位设备上表现不同,这可能导致错误,我尝试在我的项目中用CGFloat
替换所有Float
值。 但是,我无法找到一种方法将CGfloat
值截断为小数点后的2位数。
在我的项目中,我有一个函数,下载文件不断返回Float
值“progress”,表示已经下载了多少百分比的文件,通常类似于“0.3942183693039206”。 在这种情况下,我需要将数字截断为“0.39”,以便我可以更新UI,这是我的function:
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
值。 如果“test”是Float
值,结果将是0.39,这是正确的,但如果我将其更改为CGFloat
,结果将为“0.00”。
任何人都可以帮助我了解正在发生的事情,并告诉我如何正确截断CGFloat
值? 我尝试过NSNumberFormatter
但它没有用(现在)。
谢谢!
NSString(format:_: ...)
接受CVarArgType
:
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
,因此您的代码可以正常工作。