2014-12-19 35 views
3

目前,我已经在我的方法之一,下面的代码:辛格尔顿和NSNumberFormatter斯威夫特

let formatter = NSNumberFormatter() 
formatter.numberStyle = .DecimalStyle 
formatter.currencyGroupingSeparator? 
formatter.minimumFractionDigits = 2 

因为我已经在不同的视图控制器的各种功能重复这些,我怎么创造斯威夫特单身调用NSNumberFormatter并避免重复?

我认为我必须创建一个新的Swift文件,但不确定如何构造类?

+0

你并不需要为这个单身。你可以只使用一种类型的方法,发布不同类型的预先配置的事项,并使用它们。 – Abizern

回答

4

更新:的Xcode 8.2.1•斯威夫特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 
+1

XY问题的示例。 OP询问“我如何创建一个单身人士”。实际上,他想知道“如何使用很少的代码高效地对Double进行格式化”,并且这完美地回答了它。 – gnasher729

+0

@ gnasher729谢谢 –

0

好吧,我会做的是使一个正在懒洋洋地实例化的属性。这样你就不会有重复的东西,它不会被创建,并在你需要之前占用内存。

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

感谢您对我的问题的回答和编辑。这工作,但为什么不扩展,因为我不得不在其他ViewControllers中引用此扩展? – ckraider

+0

我认为你会继承这个VC。如果你愿意的话,你可以将它与扩展名配对。 – Jadar

0

NSNumberFormatter是不贵(相对于NSDateFormatter),但如果你想拥有它VENDS一次只实例化对象

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! 
} 
0

另一个辛格尔顿解决方案的一类方法:

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) ?? "" 
    } 
} 

用法:

Formatters.formatNumber(fromNumber: 100) 

当你与类型INT,CGFloat的等变量,可以使用:

Formatters.formatNumber(fromNumber: 100 as NSNumber)