のインスタンスが整数かどうかを確認する最も簡単な方法は何NSDecimalNumber
ですか?
ありがとう!
@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
これは機能するはずです。
NSDecimalNumber
に変換するメソッドの使用には注意してくださいdouble
。
NSDecimalNumber* input = [...];
NSDecimal roundedDecimal;
NSDecimalRound(&roundedDecimal, [input decimalValue], 0, NSRoundPlain);
NSDecimalNumber* roundedNumber = [NSDecimalNumber decimalNumberWithDecimal:roundedDecimal];
BOOL inputIsWholeNumber = [input isEqualToNumber:roundedNumber];
値も確認する必要がありNaN
ます。
10進数から整数を引きます。差がゼロの場合、10進数は整数です。
// testVal is NSDecimalNumber
NSString *test = [testVal stringValue];
int intVal = [test intValue];
double doubleVal = [test doubleValue];
if(doubleVal-intVal == 0){
NSLog(@"Whole number!");
}
または、整数を取得して元の値と比較します。
if(intVal == doubleVal){
NSLog(@"Whole number!");
}
if ((number % 1) == 0) は使えませんか
理由はわかりませんが、何らかの理由で Jody Hagins または Sulthan のソリューションを機能させることができなかったので、少し異なる方法で行いました。
-(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;
}
@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];
これを試してください。最初の行をスキップできます。私はそれを使用して NSDecimalNumber オブジェクトを作成しました
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");