使用千位分隔符格式化 Int64
Format Int64 with thousand separators
我已经使用下面的代码成功地用千位分隔符格式化了 Int。但是我当前的项目要求 Int64 以相同的方式格式化,它抛出错误 'Int64' is not convertible to '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 Int
本身通常与 Int64
大小相同。
您可以通过手动构造一个 NSNumber
来解决它:
let n64 = NSNumber(longLong: i64)
顺便说一句,请注意 var
技巧:它封装了用于创建 numberFormatter
的所有相关代码,这很好,但每次您使用它时,该代码都会 运行 重新生成。作为替代方案,您可以这样做:
let numberFormatter: NSNumberFormatter = {
let formattedNumber = NSNumberFormatter()
formattedNumber.numberStyle = .DecimalStyle
formattedNumber.maximumFractionDigits = 0
return formattedNumber
}()
如果它是 struct/class 中的 属性,您还可以将其设为 lazy var
,如果变量是使用过,就像您的 var
,但只有一次。
struct Thing {
lazy var numberFormatter: NSNumberFormatter = {
println("blah")
let formattedNumber = NSNumberFormatter()
formattedNumber.numberStyle = .DecimalStyle
formattedNumber.maximumFractionDigits = 0
return formattedNumber
}()
}
extension Formatter {
static let decimalNumber: NumberFormatter = {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
return formatter
}()
}
extension Numeric {
var formatted: String { Formatter.decimalNumber.string(for: self) ?? "" }
}
let x: Int64 = 1000000
x.formatted // "1,000,000"
我已经使用下面的代码成功地用千位分隔符格式化了 Int。但是我当前的项目要求 Int64 以相同的方式格式化,它抛出错误 'Int64' is not convertible to '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 Int
本身通常与 Int64
大小相同。
您可以通过手动构造一个 NSNumber
来解决它:
let n64 = NSNumber(longLong: i64)
顺便说一句,请注意 var
技巧:它封装了用于创建 numberFormatter
的所有相关代码,这很好,但每次您使用它时,该代码都会 运行 重新生成。作为替代方案,您可以这样做:
let numberFormatter: NSNumberFormatter = {
let formattedNumber = NSNumberFormatter()
formattedNumber.numberStyle = .DecimalStyle
formattedNumber.maximumFractionDigits = 0
return formattedNumber
}()
如果它是 struct/class 中的 属性,您还可以将其设为 lazy var
,如果变量是使用过,就像您的 var
,但只有一次。
struct Thing {
lazy var numberFormatter: NSNumberFormatter = {
println("blah")
let formattedNumber = NSNumberFormatter()
formattedNumber.numberStyle = .DecimalStyle
formattedNumber.maximumFractionDigits = 0
return formattedNumber
}()
}
extension Formatter {
static let decimalNumber: NumberFormatter = {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
return formatter
}()
}
extension Numeric {
var formatted: String { Formatter.decimalNumber.string(for: self) ?? "" }
}
let x: Int64 = 1000000
x.formatted // "1,000,000"