2009-07-07 6 views
1

initWithContentsOfFile로 재구성 할 때 NSValues로 언팩하는 "Numbers"(0.01, 1, 2, 6)로 구성된 배열로 plist (XCode에서 생성)를 얻었습니다. 이 NSValues를 함께 추가 할 때 사용할 수있는 NSDecimalNumbers로 변환하려면 어떻게해야합니까? 그들은 통화 값으로 취급 될 것이므로 소수점 2 자리 (아마도 4 자리)의 정밀도 만 필요합니다.NSValue를 NSDecimalNumber로 변환합니다.

"번호"대신 "문자열"로 plist 값을 저장하고 NSDecimalNumber의 initWithString을 사용하여 값을 설정했지만 NSValue가 stringValue에 응답하지 않습니다.

숫자 처리는 코코아에서 특히 혼란 스럽습니다. 많은 프레임 워크에서 너무 많은 컨테이너 형식 ... :-(

답변

0

배울 첫 번째 교훈은 어떤 종류의 정확도를 원하면 부동 소수점 (십진수) 대신 정수를 사용한다는 것입니다. 센트를 표시해야 할 때마다 100.0) 컴퓨터는 바이너리 (기본 2)와 완벽하지만, 1/(2^n)의 요소로 나눌 수없는 바이너리로 표현하려고하면 정밀 오류가 발생합니다. (0.1 + 0.1을 시도하고 무엇을 얻는 지보십시오.)

즉, 숫자를 지정하는 XML 태그는 -[NSArray initWithContentsOfFile:]과 같은 것을 사용할 때 값이 코코아 클래스의 관점에서 어떻게 해석되는지에 차이가 있습니다. "재구성"하십시오.을 참조하십시오. 자세한 내용과 예제는3210 및 this Apple article을 참조하십시오.

귀하가 원하는 것을 달성하려면 plist의 값을 중심으로 <real> 또는 <integer> (및 일치하는 닫기 태그)을 사용하고 있는지 확인하십시오. (Property List Editor와 Xcode는 자동으로 숫자에 소수점이 있는지 여부에 따라 올바른 것을 사용해야합니다.) 테스트에서 실수와 정수를 NSNumber 객체로 읽었습니다. NSDecimalNumber는 NSNumber의 하위 클래스이지만 모든 경우에 CFNumber와의 무료 브리지가 어떻게 작동하는지 완전히 확신 할 수 없습니다. 실험은 아마도 이것을 파악하는 가장 좋은 방법 일 것입니다.

+0

100 번 곱셈 방식은 대부분의 통화에 적합하지만 일반적이 아닙니다. 현재 로케일의 NSNumberFormatter에서 maximumFractionDigits를 얻은 다음 내 정수에 10^maxDigits를 곱하면됩니다. 그래도 컴퓨팅의 현대 시대에 통화와 같은 공통점을 다루는 것이 어렵거나 혼란스러운 것처럼 보이지는 않습니다. – Meltemi

+0

혼란스럽지 않은 점이 있다면 좋을 것입니다. 그러나 바이너리/십진법 문제로, 돈을 바이너리로 바꾸지 않으면 그 주위에 쉬운 방법이 보이지 않습니다. :-) –

1

숫자를 속성 목록에 문자열로 직접 저장할 수 있어야합니다. NSString을 plist에 저장할 때 NSString에 대한 NSValue 배치를 수행 할 필요가 없습니다. NSDecimals 또는 NSDecimalNumbers 같이 응용 프로그램에서 숫자를 유지하여 initWithString : locale을 사용하여 plist에서 읽고 부동 소수점 오류를 방지하고 descriptionWithLocale :을 사용하여 plist에 쓰는 것이 좋습니다. 십진수를 문자열로 저장 및 검색하면 부동 소수점 변환 오류가 발생하지 않습니다.

관련 문제