2013-02-22 2 views
0

서버에서 오는 값이 NSString, NSInteger 또는 float인지 확인해야합니다. 문자열의 경우 확인할 수 있습니다. 그러나 어떻게 float과 integer를 구별 할 수 있습니까?IOS에서 NSInteger 또는 부동 소수점 숫자인지 확인하는 방법은 무엇입니까?

+0

당신은/플로트/문자열을 정수로 문자열을 구문 분석하고 있습니까? – HKTonyLee

+2

서버에서이 "가치"를 얻는 방법에 대한 세부 정보를 추가하십시오. – jimpic

+0

서버에서 오는 값을 추가하십시오. – rptwsthi

답변

2

(난 당신이 서버에서 일부 문자열을 구문 분석하고 있다고 가정합니다. 그리고 로컬 INT/플로트/문자열로 변환합니다.)

클라이언트와 서버 모두 약간의 사양에 동의해야합니다. 예를 들어 부동 소수점에는 소수점이 와야합니다. 또는 결과에는 구체적인 유형을 설명하는 필드가 하나 더 있습니다. 문자열 값에서 실제 유형을 추론 할 수 없기 때문입니다.

정교하게 말하면 서버에서 "9.000"이 표시됩니다. int인지 float인지는 알 수 없습니다. 그러나 소수점의 존재가 부동 소수점을 의미한다는 데 동의하는 경우. 그것은 float가되지만 int는 아닙니다. 이 사실을 사용하여 파서를 만들 수 있습니다.

(중요) 또한 문자열에서 부동 소수점을 구문 분석 할 때 일반적으로 숫자 오류가 발생합니다. 서버가 클라이언트보다 부동 소수점 정확도가 낮 으면 클라이언트는 정확한 float 값을 얻을 수 없습니다. 부동 소수점 대신 고정 소수점으로 구문 분석해야합니다.

6

여기의 그것보다 일반적인 만들어 보자,

NSNumber * n = //from somewhere 
if (strcmp([n objCType], @encode(float)) == 0) { 
    NSLog(@"this is a float"); 
} else if (strcmp([n objCType], @encode(int)) == 0) { 
    NSLog(@"this is an int"); 
} 

편집

확인을 수행하는 방법

NSNumber *anyNSObject = [NSNumber numberWithFloat:0.4]; 

    id obj = anyNSObject; //you can pass anything here as long as it is inherited from NSObject 

    if ([obj isKindOfClass:[NSString class]]) { 
     NSLog(@"This is string"); 
    } 

    if ([obj isKindOfClass:[NSNumber class]]) { 
     NSLog(@"This is NSNumber"); 

     if (strcmp([obj objCType], @encode(float)) == 0) { 
      NSLog(@"this is a float"); 
     } else if (strcmp([obj objCType], @encode(int)) == 0) { 
      NSLog(@"this is an int"); 
     } 
    } 
+1

입력 유형이 불분명하지만 대부분의 경우 작동합니다. – jimpic

+0

그래,이 솔루션은 좋습니다 :) 잘 작동합니다. 고마워요 –

-1

더블 VAR = 4.1;

if(ceil(var) == var){ 
     //Int value 
    }else{ 
    //Float value 
    } 
+0

1.0은 부동입니다. – jimpic

1

간단한 방법은 다음과 같습니다

NSRange range = [yourString rangeOfString:@"."]; 

if (range.length > 0){ 
    NSLog(@"Double value"); 
} 
else { 
    NSLog(@"Integer value"); 
} 
+0

지역화 된 숫자 형식에는 안전하지 않습니다. – jimpic

관련 문제