使用千位分隔符格式化Int64

Kas*_*hif 7 xcode ios swift

我已成功使用下面的代码来格式化具有千位分隔符的Int.但是我当前的项目要求Int64以相同的方式格式化它会抛出错误'Int64'不能转换为'NSNumber'

var numberFormatter: NSNumberFormatter {
    let formattedNumber = NSNumberFormatter()
    formattedNumber.numberStyle = .DecimalStyle
    formattedNumber.maximumFractionDigits = 0
    return formattedNumber
}
Run Code Online (Sandbox Code Playgroud)

Air*_*ity 7

你的意思是当你打电话numberFormatter.stringFromNumber(12345678)给上面的代码后,像这样?

let i64: Int64 = 1234567890
numberFormatter.stringFromNumber(i64)
Run Code Online (Sandbox Code Playgroud)

看起来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)
Run Code Online (Sandbox Code Playgroud)

这有点令人困惑,因为Swift Int本身通常与Int64s 相同.

您可以NSNumber通过手工构建来解决它:

let n64 = NSNumber(longLong: i64)
Run Code Online (Sandbox Code Playgroud)

BTW要注意这个var技巧:它很好地封装了所有相关的代码来创建numberFormatter,但是每次使用它时代码都会重新运行.作为替代方案,您可以这样做:

let numberFormatter: NSNumberFormatter = {
    let formattedNumber = NSNumberFormatter()
    formattedNumber.numberStyle = .DecimalStyle
    formattedNumber.maximumFractionDigits = 0
    return formattedNumber
}()
Run Code Online (Sandbox Code Playgroud)

如果它是struct/class中的属性,那么你也可以使它成为一个lazy var额外的好处,即只有在使用变量时才会运行,比如你的var,但只有一次.

struct Thing {
    lazy var numberFormatter: NSNumberFormatter = {
        println("blah")
        let formattedNumber = NSNumberFormatter()
        formattedNumber.numberStyle = .DecimalStyle
        formattedNumber.maximumFractionDigits = 0
        return formattedNumber
    }()
}
Run Code Online (Sandbox Code Playgroud)


Leo*_*bus 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"
Run Code Online (Sandbox Code Playgroud)