2015-06-26 14 views
10

Ich kann keine Ressourcen zu diesem Thema finden, und ich habe alle möglichen Dinge versucht, aber nichts funktioniert.Wie man eine NSDecimalNumber in swift runden?

Laut Apples Dokumentation runden Sie ein NSDecimalNumber wie folgt aus:

NSDecimalNumber.decimalNumberByRoundingAccordingToBehavior(<#behavior: NSDecimalNumberBehaviors?#>) 

Es in einem NSDecimalNumberBehavior nimmt, die ich bin nicht sicher, wie zu manipulieren, da es (1) nicht in eine Variable ausgelöst werden und haben es sind Eigenschaften geändert, und (2) die Methode roundingMode() gemäß der Dokumentation nimmt keine Parameter an, aber Xcode füllt einen Parameterraum für "self".

Ich bin total auf diesem verloren. Zurück zur Grundfrage; Wie kann ich eine NSDecimalNumber in swift runden?

Vielen Dank im Voraus

+0

NSDecimalNumber.decimalNumberByRoundingAccordingToBehavior: ist keine Klassenmethode. Dies bedeutet, dass Sie eine Dezimalzahl-Instanz aufrufen können, um ihren gerundeten Wert zu erhalten. –

Antwort

7

Sie es so, dass

let x = 5 
let y = 2 
let total = x.decimalNumberByDividingBy(y).decimalNumberByRoundingAccordingToBehavior(NSDecimalNumberHandler(roundingMode: NSRoundingMode.RoundUp, scale: 0, raiseOnExactness: false, raiseOnOverflow: false, raiseOnUnderflow: false, raiseOnDivideByZero: false)) 
+1

Wie String-Manipulation und andere Dinge in Swift, ist jemand anders gestört, wie viel Code erforderlich ist, um dies einfach zu tun? – NullHypothesis

7

NSDecimalNumberBehaviors ist ein Protokoll und somit nicht instanziiert werden kann tun können. Sie benötigen ein dem Protokoll entsprechendes Objekt einer Klasse. Apple stellt die Klasse NSDecimalNumberHandler für diesen Zweck, z.B .:

let handler = NSDecimalNumberHandler(roundingMode: NSRoundingMode.RoundBankers, scale: 0, raiseOnExactness: false, raiseOnOverflow: false, raiseOnUnderflow: false, raiseOnDivideByZero: false) 
let rounded = dec.decimalNumberByRoundingAccordingToBehavior(handler) 

Das scale Argument ist die Anzahl der Dezimalstellen Sie wollen, das heißt, 0 Runden auf eine ganze Zahl.

+0

Die Verwendung von defaultDecimalNumberHandler scheint keine Rundung zu verursachen. Können Sie ein Beispiel geben? – Naldhelaan

+0

@Naldhelaan Mein Fehler in Bezug auf den Standard-Handler, siehe Beispiel für den Aufbau eines eigenen. – Arkku

1
// get a decimal num from a string 

let num = NSDecimalNumber.init(string: numStr) 

// create an NSDecimalNumberHandler instance 

let behaviour = NSDecimalNumberHandler(roundingMode:.RoundUp, 
scale: 1, raiseOnExactness: false, 
raiseOnOverflow: false, raiseOnUnderflow: 
false, raiseOnDivideByZero: false) 

// pass the handler to the method decimalNumberByRoundingAccordingToBehaviour. 

// This is an instance method on NSDecimalNumber that takes an object that 
// conforms to the protocol NSDecimalNumberBehaviors, which NSDecimalNumberHandler does! 

let numRounded = num.decimalNumberByRoundingAccordingToBehavior(behaviour)