如何截断CGFloat值?

时间:2015-04-02 04:11:10

标签: ios iphone swift

因为我注意到FloatCGFloat在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": enter image description here enter image description here

出于好奇,我试图在操场上复制这种情况,并成功地做到了。代码简单如下:

var test:CGFloat = 0.3920394829459
let truncated = NSString(format: "%.2f", test)
let float = truncated.floatValue

会有不同的输出,具体取决于" test"变量是FloatCGFloat值。如果"测试"是一个Float值,结果是0.39,这是正确的,但如果我将其更改为CGFloat,结果将是" 0.00"。

任何人都可以帮助我了解正在发生的事情,并告诉我如何正确截断CGFloat值吗?我试过NSNumberFormatter,但它现在没有用。

谢谢!

1 个答案:

答案 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,因此您的代码可以按原样运行。