Las soluciones de Jonathan, hpique y Prashant todos tienen el mismo error : implican la conversión de NSNumber
a tipos de precisión fija (diversamente double
, long long
, etc.), que se rompe si el valor es muy grande NSDecimalNumber
. Por ejemplo, la respuesta aceptada falla en NSDecimalNumber(string: "1000000000000000.1")
.
Una aplicación más seguro (como una extensión, en 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 }
}
O en Objective-C, como una función global:
BOOL NumberIsFraction(NSNumber *number) {
NSDecimal rounded = number.decimalValue;
NSDecimalRound(&rounded, &rounded, 0, NSRoundDown);
return ![number isEqualToNumber:
[[NSDecimalNumber alloc] initWithDecimal:rounded]];
}
Creo que esos deberían ser '! ='? 'NumberIsFraction (@ (0.0f))' devolvería 'SÍ', ¿no? – hypercrypt
Ah, sí, brainfart. :) –