微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ios – 使用千位分隔符格式化Int64

我已成功使用下面的代码来格式化具有千位分隔符的Int.但是我当前的项目要求Int64以相同的方式格式化它会抛出错误’Int64’不能转换为’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 Ints本身通常与Int64相同.

你可以通过手工构建NSNumber来解决它:

let n64 = NSNumber(longLong: i64)

BTW要注意var技巧:它很好地封装了用于创建numberFormatter的所有相关代码,但是每次使用它时代码都会重新运行.作为替代方案,您可以这样做:

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

如果它是struct / class中的属性,你也可以使它成为一个懒惰的var,它具有额外的好处,即只在运行时才使用变量,就像var一样,但只有一次.

struct Thing {
    lazy var numberFormatter: NSNumberFormatter = {
        println("blah")
        let formattednumber = NSNumberFormatter()
        formattednumber.numberStyle = .DecimalStyle
        formattednumber.maximumFractionDigits = 0
        return formattednumber
    }()
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐