4

のインスタンスが整数かどうかを確認する最も簡単な方法は何NSDecimalNumberですか?

ありがとう!

4

7 に答える 7

10
@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
于 2012-09-06T17:07:29.833 に答える
3

これは機能するはずです。

NSDecimalNumberに変換するメソッドの使用には注意してくださいdouble

NSDecimalNumber* input = [...];

NSDecimal roundedDecimal;
NSDecimalRound(&roundedDecimal, [input decimalValue], 0, NSRoundPlain);

NSDecimalNumber* roundedNumber = [NSDecimalNumber decimalNumberWithDecimal:roundedDecimal];

BOOL inputIsWholeNumber = [input isEqualToNumber:roundedNumber];

値も確認する必要がありNaNます。

于 2012-09-06T13:53:13.637 に答える
3

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!");
}
于 2012-09-06T11:30:55.670 に答える
0

if ((number % 1) == 0) は使えませんか

于 2012-09-06T11:51:39.547 に答える
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;
}
于 2014-08-10T03:13:46.233 に答える
0
@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];
于 2012-09-06T11:52:57.370 に答える
-3

これを試してください。最初の行をスキップできます。私はそれを使用して 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");
于 2012-09-06T11:24:21.230 に答える