繁体   English   中英

使用千位分隔符格式化 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所有相关代码,这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
    }()
}
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"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM