2016-05-26 16 views
0

Gibt es eine NSNumberFormatter ähnlich wie SpellOutStyle mit „und“ Ich versuche Projekt Euler # 17 zu lösen, die Zahlen auszuschreiben erfordert mit „und“NSNumberFormatter SpellOutStyle mit „und“

Zum Beispiel würde 556 sein 550-6

Mit NSNumberFormatter habe ich den folgenden Code

let formatter = NSNumberFormatter() 
formatter.numberStyle = NSNumberFormatterStyle.SpellOutStyle 
let number = formatter.stringFromNumber(556)! 
print(number) //prints five hundred fifty-six 

NSNumberFormatterStyle.SpellOutStyle nicht die „und“ listet. Gibt es eine andere Methode, die ich verwenden kann, um das "und" zu drucken?

+0

Die Verwendung von 'und' zwischen 'fünfhundert' und' sechsundfünfzig' ist keine richtige Grammatik. – rmaddy

+1

@rmaddy, aber das ist, was die Problemdomäne möchte ich drucken. "HINWEIS: Zählen Sie keine Leerzeichen oder Bindestriche. Zum Beispiel enthält 342 (dreihundertzweiundvierzig) 23 Buchstaben und 115 (einhundertfünfzehn) enthält 20 Buchstaben. Die Verwendung von" und "beim Schreiben von Zahlen ist in Übereinstimmung mit britischer Nutzung. " – Mochi

+0

Es liegt eher im Geiste des Projekts Euler, es zu implementieren, ohne eine eingebaute Bibliotheksfunktion zu verwenden. –

Antwort

0

"fünfhundert und sechsundfünfzig" ist richtiges Englisch in meinen Ohren. Es gibt jedoch kein Gebietsschema, in dem NSNumberFormatter Ihnen das Ergebnis zurückgibt. Sie können Ihre eigene Rolle von Subklassen NSNumberFormatter:

class MyNumberFormatter: NSNumberFormatter { 
    override init() { 
     super.init() 
     self.numberStyle = .SpellOutStyle 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

    override func stringFromNumber(number: NSNumber) -> String? { 
     // Make sure the number is an integer. Otherwise use NSNumberFormatter default formatting 
     guard ceil(number.doubleValue) == floor(number.doubleValue) else { 
      return super.stringFromNumber(number) 
     } 

     switch (number.integerValue - (number.integerValue % 100), abs(number.integerValue % 100)) { 
     case let (bigUnit, smallUnit) where abs(bigUnit) >= 100 && 0 < smallUnit && smallUnit < 100: 
      return super.stringFromNumber(bigUnit)! + " and " + super.stringFromNumber(smallUnit)! 
     default: 
      return super.stringFromNumber(number) 
     } 
    } 
} 

// Usage: 
let formatter = MyNumberFormatter() 
print(formatter.stringFromNumber(556)!) 

Offensichtlich funktioniert dies nur für ganze Zahlen und englischen Gegenden.