Check if NSDecimalNumber is an integer

What is the easiest way to check if an instance of NSDecimalNumber an integer?

Thanks!

+4
source share
7 answers
 @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 
+10
source

Subtract the integer from the decimal. If the difference is zero, then the decimal is an integer.

 // testVal is NSDecimalNumber NSString *test = [testVal stringValue]; int intVal = [test intValue]; double doubleVal = [test doubleValue]; if(doubleVal-intVal == 0){ NSLog(@"Whole number!"); } 

Or, get an integer and compare with the original value:

 if(intVal == doubleVal){ NSLog(@"Whole number!"); } 
+3
source

That should work.

Beware of using methods that convert NSDecimalNumber to 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 the NaN values.

+3
source

Can you use if ((number% 1) == 0)

0
source
 @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]; 
0
source

Not sure why, but for some reason I was not able to get the solutions of Jody Hagins or Sulthan to work, so I went a little differently:

 -(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; } 
0
source

Try this, you can skip the first line, I just used it to create an 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"); 
-3
source

Source: https://habr.com/ru/post/1432702/


All Articles