【问题标题】:Format Int64 with thousand separators使用千位分隔符格式化 Int64
【发布时间】:2015-02-28 05:55:02
【问题描述】:

我已经成功地使用下面的代码来格式化带有千位分隔符的 Int。但是我当前的项目要求 Int64 以相同的方式格式化,它会抛出错误 'Int64' is not convertible to 'NSNumber'

var numberFormatter: NSNumberFormatter {
    let formattedNumber = NSNumberFormatter()
    formattedNumber.numberStyle = .DecimalStyle
    formattedNumber.maximumFractionDigits = 0
    return formattedNumber
}

【问题讨论】:

    标签: ios xcode swift


    【解决方案1】:

    你的意思是当你在上面的代码之后调用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 本身的大小通常与 Int64s 相同。

    您可以通过手动构造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
        }()
    }
    

    【讨论】:

      【解决方案2】:
      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"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-31
        • 1970-01-01
        • 2018-09-05
        • 1970-01-01
        • 2011-03-12
        • 2016-10-03
        • 1970-01-01
        • 2016-10-07
        相关资源
        最近更新 更多