Skip to content

Instantly share code, notes, and snippets.

@AlexZverusha
Created October 7, 2020 11:03
Show Gist options
  • Save AlexZverusha/ff1129e1072197c1d9a82d23ffa39354 to your computer and use it in GitHub Desktop.
Save AlexZverusha/ff1129e1072197c1d9a82d23ffa39354 to your computer and use it in GitHub Desktop.
Rounding with NSDecimalNumberBehaviors
// sample
//let amountNumberBehaviors = AmountNumberBehaviors()
//let result = amountNumberBehaviors.round(value: value, style: .decades)
class AmountNumberBehaviors: NSDecimalNumberBehaviors {
var badException = false
func roundingMode() -> NSDecimalNumber.RoundingMode {
return .up
}
func scale() -> Int16 {
return 0
}
func exceptionDuringOperation(_ operation: Selector, error: NSDecimalNumber.CalculationError, leftOperand: NSDecimalNumber, rightOperand: NSDecimalNumber?) -> NSDecimalNumber? {
//very bad, needs to some exception handling
return nil
}
func round(value: String, style: RoundStyle) -> NSDecimalNumber? {
var decimal = NSDecimalNumber(0)
let temp = Double(value) ?? 0
switch style{
case .decades:
let temp1 = temp * 0.1
decimal = NSDecimalNumber(floatLiteral: temp1)
case .hundreds:
let temp2 = temp * 0.01
decimal = NSDecimalNumber(floatLiteral: temp2)
}
let tempResult = decimal.rounding(accordingToBehavior: self)
switch style {
case .decades:
return (tempResult as Decimal * 10) as NSDecimalNumber
case .hundreds:
return (tempResult as Decimal * 100) as NSDecimalNumber
}
}
enum RoundStyle {
case hundreds
case decades
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment