2009-08-27 6 views
0

Brad의 CorePlot에서이 스 니펫을 보았습니다. 일부 커피가 필요하지 않았습니다. 지금은 완전히 깨어 :NSScanner는 NSDecimal을 검색하기위한 문자열을 어떻게 예상합니까?

NSDecimal result; 
NSScanner *theScanner = [[NSScanner alloc] initWithString:stringRepresentation]; 
[theScanner scanDecimal:&result]; 

그리고 애플은 말한다 :

스캐너의 로케일이 문자열에서 값을 해석하는 방법에 영향을 미칩니다. 특히 에서 스캐너는 로케일의 소수 구분 기호 에 을 사용하여 부동 소수점 표현의 정수 및 분수 부분을 구별합니다. 새 스캐너의 로켈은 기본적으로 nil이므로 은 지역화되지 않은 값을 사용합니다.

So NSScanner 인스턴스를 만들고 로캘을 제공하지 않으면 일반 소스 코드로 입력 한 것처럼 문자열로 표시되는 십진수 값을 기대할 수 있습니까?

i.E. @ "- 59933845504572.944882211"또는 @ "123.456789"또는 @ "145.002e33"또는 @ "145.002e-33"? 그것이 맞을까요?

답변

0

NSScanner는 문자열로 NSDecimalNumber를 초기화 한 것과 같은 방식으로 문자열에서 숫자 값을 추출합니다. NSDecimalNumber의 규칙에 따라 구문 분석 할 수 있습니다.

Apple의 "String Programming Guide for Cocoa"의 scanners section에 따르면 현지화는 사용자의 로켈을 기반으로합니다. 수동으로 소수점 구분 기호를 제공하려면 setLocale :을 사용하여이 값을 변경할 수 있습니다.

NSDecimalNumber *newNumber = [[NSDecimalNumber alloc] initWithString:@"1.0" locale:[NSLocale currentLocale]]; 
newDecimal = [newNumber decimalValue]; 
[newNumber release]; 

NSScanner는 NSDecimalNumber 만에 307,000했다 초, 약 582,000 변환을했다 : 그것은 다음과 같은 코드로 NSDecimalNumber를 사용하는 것보다 훨씬 빠르게 때문에

우리는 문자열에서 NSDecimal를 초기화 NSScanner를 사용 내 맥.

+0

감사합니다. 한 가지. 설명서에 "새로운 스캐너의 로켈은 기본적으로 nil이 아니기 때문에 로컬 화되지 않은 값을 사용하게됩니다." 스캐너가 사용자 로케일에 상관없이 하드 코딩 된 문자열에 대해 작동한다는 것은 아닙니다. 아니면 예를 들어 미국 로켈을 지정하는 것이 더 안전합니까? –

+0

나는 모른다. iPhone Simulator (또는 Mac)에서 미국 및 독일 로켈에서 응용 프로그램을 실행하고 소수점 구분 기호의 변경 사항을 문제없이 처리하는지 확인하여이를 테스트 할 수 있습니다. –

+0

좋은 아이디어. 새로운 단어 "장애"를 배웠습니다. 그것도 주셔서 감사합니다 ;-) –

관련 문제