2015-01-01 2 views
7

Я использовал ниже код для форматирования Int с тысячами разделителей. Однако мой текущий проект требуется Int64 быть отформатированы так же, как и он выдает ошибку «Int64» не конвертируются в «NSNumber»Формат Int64 с тысячами разделителей

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

ответ

7

Вы имеете в виду, когда вы звоните numberFormatter.stringFromNumber(12345678) после приведенного выше кода, как это?

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

Непохоже, Swift будет отлита из Int64 к 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) 

Это немного озадачив, так как Swift Int s сами, как правило, такой же размер, как Int64 с.

Вы можете работать вокруг него, построив NSNumber вручную:

let n64 = NSNumber(longLong: i64) 

BTW остерегаться, что var трюка: это хорошо, что он инкапсулирует весь необходимый код для создания numberFormatter, но этот код будет работать заново каждый раз, когда вы используете его. В качестве альтернативы вы можете сделать это:

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

Если это свойство в STRUCT/классе, вы можете также сделать его lazy var, который имеет дополнительное преимущество, только будучи запущен, если используется переменная, как ваш var , но только один раз.

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

метод да Лунлун сделал трюк для меня. – 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"