まーぽんって誰がつけたの?

iOS→Scala→インフラなおじさん技術メモ

NSDecimalNumberで整数なのか小数なのかチェックする

色々やり方はあるかもしれないけど、これでいいか。

整数は小数点をもたないので切り上げても、切り捨てても同じ値になるのを利用。

- (BOOL)isInteger:(NSDecimalNumber *)num
{
    // 少数第1位を切り捨て
    NSDecimalNumber *floorNum =
    [num decimalNumberByRoundingAccordingToBehavior:
     [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundDown
                                                            scale:0
                                                 raiseOnExactness:NO
                                                  raiseOnOverflow:NO
                                                 raiseOnUnderflow:NO
                                              raiseOnDivideByZero:NO]];
    // 少数第1位を切り上げ
    NSDecimalNumber *ceillNum =
    [num decimalNumberByRoundingAccordingToBehavior:
     [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundUp
                                                            scale:0
                                                 raiseOnExactness:NO
                                                  raiseOnOverflow:NO
                                                 raiseOnUnderflow:NO
                                              raiseOnDivideByZero:NO]];
    
    return [floorNum compare:ceillNum] == NSOrderedSame;
}


- (void)testIsInteger
{
    NSDecimalNumber *d;
    d = [NSDecimalNumber decimalNumberWithString:@"1.2"];
    XCTAssertFalse([self isInteger:d], @"1.2 が整数と判断されてしまう");
    d = [NSDecimalNumber decimalNumberWithString:@"1.03"];
    XCTAssertFalse([self isInteger:d], @"小数点第1位が0の少数1.03が整数と判断されてしまう");
    d = [NSDecimalNumber decimalNumberWithString:@"3"];
    XCTAssertTrue([self isInteger:d], @"整数が小数と判断されてしまう");
    d = [NSDecimalNumber decimalNumberWithString:@"0"];
    XCTAssertTrue([self isInteger:d], @"0が小数と判断されてしまう");
    d = [NSDecimalNumber decimalNumberWithString:@"-1"];
    XCTAssertTrue([self isInteger:d], @"負の整数が小数と判断されてしまう");
    d = [NSDecimalNumber decimalNumberWithString:@"-1.5"];
    XCTAssertFalse([self isInteger:d], @"負の小数が整数と判断されてしまう");
}

しかし、相変わらずメソッド名長いなw