Testing if a Decimal is a whole number in Swift

后端 未结 3 1833
慢半拍i
慢半拍i 2020-12-19 14:15

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

相关标签:
3条回答
  • 2020-12-19 14:17

    Thanks for the comments! Here is what I am using now.

    extension Decimal {
        var isWholeNumber: Bool { 
            return self.isZero || (self.isNormal && self.exponent >= 0) 
        }
    }
    
    0 讨论(0)
  • 2020-12-19 14:22

    I'm not sure can works in all cases but that maybe a more coincise option

    extension Decimal {
    
        static var decimalSeparator: String { return NumberFormatter().decimalSeparator }
    
        var isFraction: Bool {
            return self.description.contains(Decimal.decimalSeparator)
        }
    
        var isWhole: Bool {
            return !isFraction
        }
    
    }
    
    0 讨论(0)
  • 2020-12-19 14:42

    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
    
    0 讨论(0)
提交回复
热议问题