The rozwiązania z Jonathanem, hpique i Prashant wszystkie mają ten sam błąd : obejmują odlewanie NSNumber
do typów o stałej precyzji (różne double
, long long
itd.), które zrywają się, jeśli ich wartość jest bardzo duża NSDecimalNumber
. Na przykład zaakceptowana odpowiedź nie powiedzie się na NSDecimalNumber(string: "1000000000000000.1")
.
Bezpieczniejsze realizacja (jako przedłużenie w Swift):
extension NSNumber {
var isInteger: Bool {
var rounded = decimalValue
NSDecimalRound(&rounded, &rounded, 0, NSRoundingMode.RoundDown)
return NSDecimalNumber(decimal: rounded) == self
}
var isFraction: Bool { return !isInteger }
}
Albo w Objective-C, jako globalnej funkcji:
BOOL NumberIsFraction(NSNumber *number) {
NSDecimal rounded = number.decimalValue;
NSDecimalRound(&rounded, &rounded, 0, NSRoundDown);
return ![number isEqualToNumber:
[[NSDecimalNumber alloc] initWithDecimal:rounded]];
}
Myślę, że powinny to być '! ='? 'NumberIsFraction (@ (0.0f))' zwraca "TAK", prawda? – hypercrypt
Ach, tak, brainfart. :) –