2015-01-01 21 views
7

Tôi đã sử dụng mã bên dưới thành công để định dạng Int với hàng nghìn dấu tách. Tuy nhiên dự án hiện tại của tôi yêu cầu Int64 phải được định dạng theo cùng một cách và nó throws lỗi 'Int64' không phải là chuyển đổi thành 'NSNumber'Định dạng Int64 với hàng nghìn dấu tách

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

Trả lời

7

Bạn có nghĩa là khi bạn gọi numberFormatter.stringFromNumber(12345678) sau khi mã trên, như thế này?

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

Không giống như Swift sẽ được đúc từ một Int64 một 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) 

Đây là một chút nhiễu, vì Swift Int s là mình thường cùng kích thước như Int64 s.

Bạn có thể làm việc xung quanh nó bằng cách xây dựng một NSNumber bằng tay:

let n64 = NSNumber(longLong: i64) 

BTW hãy cẩn thận rằng var lừa: nó đẹp mà nó gói gọn tất cả các mã có liên quan để tạo numberFormatter, nhưng code mà sẽ chạy lại từ đầu mỗi khi bạn sử dụng nó. Là một thay thế bạn có thể làm điều này:

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

Nếu đó là một tài sản trong một struct/lớp, bạn cũng có thể làm cho nó một lazy var trong đó có lợi ích bổ sung chỉ là chạy nếu biến được sử dụng, như var của bạn , nhưng chỉ một lần.

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

phương pháp có Longlong đã làm các trick cho tôi. – 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" 
Các vấn đề liên quan