首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何截断CGFloat值?

如何截断CGFloat值?
EN

Stack Overflow用户
提问于 2015-04-02 04:11:10
回答 1查看 2.1K关注 0票数 2

由于我注意到FloatCGFloat在32位和64位设备上的行为不同,这可能会导致错误,所以我尝试在我的项目中用CGFloat替换所有的Float值。但是,我想不出在小数点之后将CGfloat值截断为2位的方法。

在我的项目中,我有一个函数,下载文件不断地返回一个Float值“进度”,显示下载的文件总数的百分比,通常类似于"0.3942183693039206“。在本例中,我需要将数字截断为"0.39“,以便对UI进行更新,下面是我的函数:

代码语言:javascript
复制
    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":

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

代码语言:javascript
复制
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,但(暂时)没有成功。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-02 04:43:15

NSString(format:_: ...)接受CVarArgType

代码语言:javascript
复制
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

代码语言:javascript
复制
NSString(format: "%.2f", Double(test))

注意:从SWIFT1.2开始,由于CGFloat符合CVarArgType,所以代码按原样工作。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29404849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档