我已成功使用下面的代码来格式化具有千位分隔符的Int.但是我当前的项目要求Int64以相同的方式格式化它会抛出错误’Int64’不能转换为’NSNumber’
var numberFormatter: NSNumberFormatter { let formattedNumber = NSNumberFormatter() formattedNumber.numberStyle = .DecimalStyle formattedNumber.maximumFractionDigits = 0 return formattedNumber }
解决方法
你的意思是当你在上面的代码之后调用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 Ints本身通常与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 / class中的属性,你也可以使它成为一个懒惰的var,它具有额外的好处,即只在运行时才使用变量,就像var一样,但只有一次.
struct Thing { lazy var numberFormatter: NSNumberFormatter = { println("blah") let formattedNumber = NSNumberFormatter() formattedNumber.numberStyle = .DecimalStyle formattedNumber.maximumFractionDigits = 0 return formattedNumber }() }