Singleton and NSNumberFormatter in Swift

喜夏-厌秋 提交于 2019-12-05 23:58:55

update: Xcode 8.2.1 • Swift 3.0.2

extension Double {
    static let twoFractionDigits: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
        formatter.minimumFractionDigits = 2
        formatter.maximumFractionDigits = 2
        return formatter
    }()
    var formatted: String {
        return Double.twoFractionDigits.string(for: self) ?? ""
    }
}

100.954345.formatted    // 100.95

Ok, what I'd do is make a property that is lazily instantiated. That way you will have no duplicates, and it won't be created and take up memory until you need it.

lazy var numberFormatter = [NSNumberFormatter] = {
    var _numberFormatter = [NSNumberFormatter]()
    _numberFormatter.numberStyle = .DecimalStyle
    _numberFormatter.currencyGroupingSeparator?
    _numberFormatter.minimumFractionDigits = 2
    return _numberFormatter
}()

NSNumberFormatter isn't that expensive (as compared to NSDateFormatter) but if you want to have a class method which vends a once only instantiated object

class var prettyFormatter:NSNumberFormatter {

        struct SingletonNumberFormatter {
            static var instance:NSNumberFormatter?
        }

        if SingletonNumberFormatter.instance == nil {
            SingletonNumberFormatter.instance = NSNumberFormatter()
            SingletonNumberFormatter.instance.numberStyle = .DecimalStyle
            SingletonNumberFormatter.instance.currencyGroupingSeparator?
            SingletonNumberFormatter.instance.minimumFractionDigits = 2
        }

        return SingletonNumberFormatter.instance!
 }

Another Singleton solution:

class Formatters{
    static let twoFractionDigits: NumberFormatter = {
        let formatter = NumberFormatter()
        formatter.numberStyle = .decimal
        formatter.minimumFractionDigits = 2
        formatter.maximumFractionDigits = 2
        return formatter
    }()
    static func formatNumber(fromNumber: NSNumber) -> String{
        return twoFractionDigits.string(from: fromNumber) ?? ""
    }
}

Usage:

Formatters.formatNumber(fromNumber: 100)

When you have a variable with types of Int, CGFloat etc, use:

Formatters.formatNumber(fromNumber: 100 as NSNumber)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!