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