你的意思是在以上代码之后调用
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
通常与Int64
大小相同。
您可以通过手动构造NSNumber
来解决此问题:
let n64 = NSNumber(longLong: i64)
顺便提醒一下,要注意那个var
的技巧:它很好地封装了创建numberFormatter
的所有相关代码,但每次使用它时该代码都会重新运行。作为替代方案,您可以这样做:
let numberFormatter: NSNumberFormatter = {
let formattedNumber = NSNumberFormatter()
formattedNumber.numberStyle = .DecimalStyle
formattedNumber.maximumFractionDigits = 0
return formattedNumber
}()
如果它是结构体/类中的属性,你也可以将其定义为“lazy var”,这样做的好处是只有在使用变量时才会运行它,就像使用了你的“var”一样,但只运行一次。
struct Thing {
lazy var numberFormatter: NSNumberFormatter = {
println("blah")
let formattedNumber = NSNumberFormatter()
formattedNumber.numberStyle = .DecimalStyle
formattedNumber.maximumFractionDigits = 0
return formattedNumber
}()
}