2014-12-19 60 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)