Reputation: 762
What's the easiest way to check if an instance of NSDecimalNumber
is a whole number?
Thanks!
Upvotes: 4
Views: 2806
Reputation: 491
Not sure why, but for some reason I was unable to get Jody Hagins' or Sulthan's solutions to work so I went a slightly different way:
-(BOOL)isWholeNumber:(NSDecimalNumber *)number {
NSDecimalNumber *input = number;
NSDecimalNumberHandler *handler = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain
scale:0
raiseOnExactness:NO
raiseOnOverflow:NO
raiseOnUnderflow:NO
raiseOnDivideByZero:NO];
NSDecimalNumber *vOne = [NSDecimalNumber decimalNumberWithString:@"1"];
NSDecimalNumber *result = [number decimalNumberByMultiplyingBy:vOne
withBehavior:handler];
BOOL inputIsWholeNumber = [input isEqualToNumber:result];
return inputIsWholeNumber;
}
Upvotes: 0
Reputation: 130200
This should work.
Beware of using methods that convert NSDecimalNumber
into double
.
NSDecimalNumber* input = [...];
NSDecimal roundedDecimal;
NSDecimalRound(&roundedDecimal, [input decimalValue], 0, NSRoundPlain);
NSDecimalNumber* roundedNumber = [NSDecimalNumber decimalNumberWithDecimal:roundedDecimal];
BOOL inputIsWholeNumber = [input isEqualToNumber:roundedNumber];
You should also check for NaN
values.
Upvotes: 3
Reputation: 28419
@interface NSDecimalNumber (IsIntegerNumber)
@property (readonly) BOOL isIntegerNumber;
@end
@implementation NSDecimalNumber (IsIntegerNumber)
-(BOOL)isIntegerNumber {
NSDecimalValue value = [self decimalValue];
if (NSDecimalIsNotANumber(&value)) return NO;
NSDecimal rounded;
NSDecimalRound(&rounded, &value, 0, NSRoundPlain);
return NSDecimalCompare(&rounded, &value) == NSOrderedSame;
}
@end
Upvotes: 10
Reputation: 22930
@implementation NSDecimalNumber (isWholeNumber)
-(BOOL)isWholeNumber
{
double x = [self doubleValue]; //The approximate value of the receiver as a double.
double y = floor (x);
if(fabs(x - y) < DBL_EPSILON)
return YES;
return NO;
}
@end
// [myDecNumber isWholeNumber];
Upvotes: 0
Reputation: 1962
Subtract the whole number from the decimal number. If the difference is zero then the decimal number is a whole number.
// testVal is NSDecimalNumber
NSString *test = [testVal stringValue];
int intVal = [test intValue];
double doubleVal = [test doubleValue];
if(doubleVal-intVal == 0){
NSLog(@"Whole number!");
}
Or, get the whole number and compare to the original value:
if(intVal == doubleVal){
NSLog(@"Whole number!");
}
Upvotes: 3
Reputation: 2807
Try this, you can skip first line, i just used it to create a NSDecimalNumber object
NSDecimalNumber *decNumb=[NSDecimalNumber decimalNumberWithString:@"20.5"];//try with just 20
NSString* str=[NSString stringWithFormat:@"%@",decNumb];
if ([str rangeOfString:@"."].location==NSNotFound && [str rangeOfString:@"-"].location==NSNotFound) {
NSLog(@"it is whole number");
}
else
NSLog(@"it is not whole number");
Upvotes: -3