2017-06-20 4 views
0

meine eigenen Formatierer wie dies zu machen:NumberFormatter RoundingMode mit ungewöhnlichen runden

enum Formatters { 
enum Number { 
    static let moneyFormatter: NumberFormatter = { 
     let mFormatter = NumberFormatter() 
     mFormatter.numberStyle = NumberFormatter.Style.currency 
     mFormatter.currencyGroupingSeparator = " " 
     mFormatter.roundingMode = NumberFormatter.RoundingMode.halfUp 
     mFormatter.maximumFractionDigits = 0 
     return mFormatter 
    }() 
} 

}

Und Beispiel will: Wenn 11 400 dann um bis 11 000, wenn 11 500 dann 12 000 und usw. Aber es funktioniert RoundMode nur mit Ziffern richtig, wie ist es für Gruppen eingerichtet?

Antwort

1

NumberFormatter hat eine roundingIncrement Eigenschaft für diesen Zweck:

enum Formatters { 
    enum Number { 
     static let moneyFormatter: NumberFormatter = { 
      let mFormatter = NumberFormatter() 
      mFormatter.numberStyle = .currency 
      mFormatter.roundingMode = .halfUp 
      mFormatter.roundingIncrement = 1_000 
      mFormatter.maximumFractionDigits = 0 
      return mFormatter 
     }() 
    } 
} 

let fmt = Formatters.Number.moneyFormatter 

print(fmt.string(from: 10_499.99)!) // 10.000 € 
print(fmt.string(from: 10_500.00)!) // 11.000 € 

jedoch aus irgendeinem Grund mir unbekannt, das funktioniert nicht, wenn die groupingSeparator oder currencyGroupingSeparator Eigenschaft festgelegt ist. Wenn Sie also ein nicht standardmäßiges Gruppierungstrennzeichen benötigen, müssen Sie es in der formatierten Zeichenfolge "manuell" ersetzen.

Natürlich ist eine Alternative, den Wert auf den nächsten Vielfachen von 1000 vor Formatierung zu runden. Beispiel:

let value = 10_499.99 
let roundedToThousands = (value/1000).rounded() * 1000 
Verwandte Themen