由于我注意到Float和CGFloat在32位和64位设备上的行为不同,这可能会导致错误,所以我尝试在我的项目中用CGFloat替换所有的Float值。但是,我想不出在小数点之后将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值。如果"test“是Float值,则结果为0.39,这是正确的,但是如果我将其更改为CGFloat,则结果将为"0.00”。
有人能帮助我理解正在发生的事情,并告诉我如何正确地截断CGFloat值吗?我试过NSNumberFormatter,但(暂时)没有成功。
谢谢!
发布于 2015-04-02 04:43:15
NSString(format:_: ...)接受CVarArgType:
extension NSString {
convenience init(format: NSString, _ args: CVarArgType...)但是,在SWIFT1.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))注意:从SWIFT1.2开始,由于CGFloat符合CVarArgType,所以代码按原样工作。
https://stackoverflow.com/questions/29404849
复制相似问题