Using Swift 3.
I am finding a lot of strange solutions online for checking if a Decimal
object is a whole number. Everything feels far more complicated then it needs to be.
Here is my solution:
extension Decimal {
var isWholeNumber: Bool {
return self.exponent == 1
}
}
In my tests this works. My question is am I missing something obvious?
Thanks for the comments! Here is what I am using now.
extension Decimal {
var isWholeNumber: Bool {
return self.isZero || (self.isNormal && self.exponent >= 0)
}
}
Here is a translation of the Objective-C solution in Check if NSDecimalNumber is whole number to Swift:
extension Decimal {
var isWholeNumber: Bool {
if isZero { return true }
if !isNormal { return false }
var myself = self
var rounded = Decimal()
NSDecimalRound(&rounded, &myself, 0, .plain)
return self == rounded
}
}
print(Decimal(string: "1234.0")!.isWholeNumber) // true
print(Decimal(string: "1234.5")!.isWholeNumber) // false
This works even if the mantissa is not minimal (or the exponent not maximal), such as 100 * 10-1. Example:
let z = Decimal(_exponent: -1, _length: 1, _isNegative: 0, _isCompact: 1, _reserved: 0,
_mantissa: (100, 0, 0, 0, 0, 0, 0, 0))
print(z) // 10.0
print(z.exponent) // -1
print(z.isWholeNumber) // true
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With