我已成功使用下面的代码来格式化具有千位分隔符的Int.但是我当前的项目要求Int64以相同的方式格式化它会抛出错误'Int64'不能转换为'NSNumber'
var numberFormatter: NSNumberFormatter {
let formattedNumber = NSNumberFormatter()
formattedNumber.numberStyle = .DecimalStyle
formattedNumber.maximumFractionDigits = 0
return formattedNumber
}
Run Code Online (Sandbox Code Playgroud)
你的意思是当你打电话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)
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)
| 归档时间: |
|
| 查看次数: |
1484 次 |
| 最近记录: |