簡體   English   中英

如何截斷CGFloat值?

[英]How to truncate CGFloat values?

由於我注意到FloatCGFloat在32位和64位設備上的行為不同,這可能會導致錯誤,因此我嘗試在項目中用CGFloat替換所有Float值。 但是我想不出一種方法來將CGfloat值截斷為小數點后的2位數字。

在我的項目中,我具有一個下載文件的函數,該函數不斷返回Float值“ progress”,指示已下載了總文件的百分比,通常類似於“ 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

根據“測試”變量是Float還是CGFloat值,其輸出將有所不同。 如果“ test”是一個Float值,結果將是0.39,這是正確的,但是如果我將其更改為CGFloat ,結果將是“ 0.00”。

誰能幫助我了解發生了什么,並告訴我如何正確截斷CGFloat值? 我試過NSNumberFormatter但是(目前)不起作用。

謝謝!

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) 結果, %.2f0.00

您應該將其顯式轉換為Double

NSString(format: "%.2f", Double(test))

請注意:從Swift 1.2開始,由於CGFloat符合CVarArgType ,因此您的代碼按CVarArgType工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM