使用千位分隔符格式化Int64

7
我曾成功地使用以下代码为Int格式化添加千位分隔符。然而,我的当前项目需要将Int64格式化为相同的方式,并且会抛出“Int64不可转换为NSNumber”的错误。
var numberFormatter: NSNumberFormatter {
    let formattedNumber = NSNumberFormatter()
    formattedNumber.numberStyle = .DecimalStyle
    formattedNumber.maximumFractionDigits = 0
    return formattedNumber
}
2个回答

8
你的意思是在以上代码之后调用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
    }()
}

5
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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接