2015-01-01 14 views
7

Z powodzeniem używam poniższego kodu do formatowania Int z tysiącami separatorów. Jednak mój obecny projekt wymagał Int64 być sformatowany w ten sam sposób i zgłasza błąd „Int64” nie jest wymienialny na „NSNumber”Format Int64 z tysiącami separatorów

var numberFormatter: NSNumberFormatter { 
    let formattedNumber = NSNumberFormatter() 
    formattedNumber.numberStyle = .DecimalStyle 
    formattedNumber.maximumFractionDigits = 0 
    return formattedNumber 
} 

Odpowiedz

7

To znaczy, kiedy zadzwonić numberFormatter.stringFromNumber(12345678) po powyższym kodzie, tak?

let i64: Int64 = 1234567890 
numberFormatter.stringFromNumber(i64) 

Nie wygląda Swift rzuci z Int64 do NSNumber:

let i = 1234567890 
let n = i as NSNumber // OK 
numberFormatter.stringFromNumber(i) // Also OK 

// Compiler error: 'Int64' is not convertible to 'NSNumber' 
let n64 = i64 as NSNumber 
// so the implicit conversion will also fail: 
numberFormatter.stringFromNumber(i64) 

Jest nieco mylących, ponieważ Swift Int s sami są zwykle takie same wymiary jak Int64 s.

można obejść przez konstruowania NSNumber ręcznie:

let n64 = NSNumber(longLong: i64) 

BTW Pamiętaj, że var trik: to miłe, że to oddaje cały odpowiedniego kodu do tworzenia numberFormatter, ale że kod zostanie uruchomiony na nowo za każdym razem, używasz tego. Jako alternatywę można to zrobić:

let numberFormatter: NSNumberFormatter = { 
    let formattedNumber = NSNumberFormatter() 
    formattedNumber.numberStyle = .DecimalStyle 
    formattedNumber.maximumFractionDigits = 0 
    return formattedNumber 
}() 

Jeśli jest to obiekt w struct/klasy, można również zrobić mu lazy var która ma dodatkową korzyść tylko jest uruchomiony, jeśli zmienna jest używana, jak Twój var , ale tylko raz.

struct Thing { 
    lazy var numberFormatter: NSNumberFormatter = { 
     println("blah") 
     let formattedNumber = NSNumberFormatter() 
     formattedNumber.numberStyle = .DecimalStyle 
     formattedNumber.maximumFractionDigits = 0 
     return formattedNumber 
    }() 
} 
+1

metoda tak longlong wystarczyły dla mnie. – Kashif

5
extension Int64 { 
    var formatted:String { 
     let formatter = NSNumberFormatter() 
     formatter.numberStyle = .DecimalStyle 
     formatter.minimumFractionDigits = 0 
     return formatter.stringFromNumber(Int(self)) ?? "" 
    } 
} 

let x:Int64 = 1000000 
x.formatted // "1,000,000" 
Powiązane problemy