2012-09-06 4 views
3

NSDecimalNumber의 인스턴스가 정수인지 확인하는 가장 쉬운 방법은 무엇입니까?NSDecimalNumber가 정수인지 확인하십시오

감사합니다.

+3

무엇 u는 시도를 ?? – IronManGill

+3

잘 모르겠습니다. 'if ([myDecNumber isEqualToNumber : [myDecNumber integerValue]])'는 어떨까요? –

+0

10 진수 값을 int로 캐스팅하고 그 값이 동일하면 – muffe

답변

9
@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 
+1

Swift version here : https://stackoverflow.com/a/46331176/1187415. –

-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"); 
+0

downvote의 이유를 알려주실 수 있습니까? – Neo

+0

현지화에는별로 좋지 않습니다. 숫자가 "2.0"이면 어떻게 될까요? – Sulthan

+0

NSDecimalNumber는 20.0을 20으로 자동 변환합니다. 자신을 확인하십시오 – Neo

3

을 만드는 데 사용했다. 차이가 0이면 십진수는 정수입니다.

// 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!"); 
} 
+0

답변을 편집하여 'double'을 'int'로 변경했습니다. 그러나 원래 버전이 잘 작동한다고 생각합니다. 귀찮게해서 미안해. –

+0

예, 그렇습니다. 괜찮아. – yoninja

+0

'double '을 사용하는 모든 메소드는 NSDecimalNumber와 함께 사용할 수 없습니다. 전화 번호가 30 자리이면 어떻게 될까요? – Sulthan

0

당신이 사용할 수없는 경우 ((번호 % 1) == 0)

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]; 
+0

정밀도가 떨어집니다. 'double'은'NSDecimalNumber'의 모든 값을 커버 할 수 없습니다. – Sulthan

+0

'NSDecimalNumber'를'double' 또는'float'로 변환 할 때 약간의 정밀도가 손실된다는 인상을 받았습니다. 나는이 점에 착각 할 수는 있지만 실제로 접근했다면이 접근법의 결과가 영향을 받을지 궁금하다. 감사. – James

+0

@Sulthan NSDecimalNumber는 base-10 인 반면 double은 base-2이기 때문에 Yes입니다. –

3

이 작동해야합니다.

NSDecimalNumberdouble으로 변환하는 방법을주의하십시오.

NSDecimalNumber* input = [...]; 

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

NSDecimalNumber* roundedNumber = [NSDecimalNumber decimalNumberWithDecimal:roundedDecimal]; 

BOOL inputIsWholeNumber = [input isEqualToNumber:roundedNumber]; 

또한 NaN 값을 확인해야합니다.

+0

아직 테스트 할 기회가 없지만 이것이 내가 찾고있는 해결책 인 것 같습니다. 고맙습니다. – James

+0

@James Jody Hagins의 답변도 확인하십시오. – Sulthan

+0

귀하의 수락을받은 직후에 제출했습니다. 나는 둘 다 upvoted지만, 나는 그/그녀의 허용 된 대답을 변경하는 것이 다른 사람에게 빠른 대답을 찾는 데 더 도움이 될 것 같아요. 당신이 꺼리지 않기를 바랍니다. – James

0

확실하지 왜,하지만 난 조디 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; 
} 
관련 문제