我已成功使用以下代码来格式化具有千位分隔符的Int。但是我当前的项目要求Int64以相同的方式格式化它会抛出错误'Int64'不能转换为'NSNumber'
var numberFormatter: NSNumberFormatter {
let formattedNumber = NSNumberFormatter()
formattedNumber.numberStyle = .DecimalStyle
formattedNumber.maximumFractionDigits = 0
return formattedNumber
}
答案 0 :(得分: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
本身通常与Int64
s的大小相同。
您可以通过手工构建NSNumber
来解决此问题:
let n64 = NSNumber(longLong: i64)
BTW要注意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
}()
}
答案 1 :(得分: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"