2014-12-19 4 views
3

В настоящее время, я следующий код в одном из моих методов:Singleton и NSNumberFormatter в Swift

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

Потому что я должен повторить эти различные функции в разных контроллерах зрения, как создать одноэлементный в Swift вызвать NSNumberFormatter и избежать дубликатов?

Я предполагаю, что мне нужно создать новый файл Swift, но не знаете, как построить класс?

+0

Вам не нужно синглтона для этого. Вы можете просто использовать метод типа, который поддерживает различные типы предварительно настроенных для вопросов и просто их использовать. – Abizern

ответ

4

обновление: 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 
+1

Пример вопроса XY. ОП спросил: «Как создать одноэлементный». На самом деле, он хотел знать «как я могу форматировать 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

Другое решение Singleton:

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)