2010-11-21 1 views
0

내 앱에서 금전적 가치를 사용하고 있으며 사용자가 iPhone에서 설정 한 통화 및 형식으로이 값을 나타내려고합니다. 테스트 할 때 독일 EURO 형식으로 문제가있는 것 같습니다.NSLecale을 사용하여 NSDecimalNumber가있는 유로화 형식의 iPhone 통화가있는 버그?

통화 서식이 지정된 문자열에서 10 진수 (핵심 데이터에 저장하기 위해)를 반환하는 메서드가 있습니다. 이 문자열은 실제로 NSlocale을 사용하는 다른 (유사한) 메서드로 포맷되었습니다.

영국, 미국, 일본 및 독일 로켈에서 테스트 한 결과 지금까지 독일에서만 문제가 발생했습니다. 모두 반면 -18446912453607470532000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

: 2,56 €

+ (NSDecimalNumber*)TLCurrencyFormatFromString:(NSString*)strNumber { 


NSNumberFormatter *fmtrCurrencyFromStr = nil; 

fmtrCurrencyFromStr = [[NSNumberFormatter alloc] init]; 
[fmtrCurrencyFromStr setFormatterBehavior:NSNumberFormatterBehavior10_4]; 
[fmtrCurrencyFromStr setLocale:[NSLocale currentLocale]]; 
[fmtrCurrencyFromStr setNumberStyle:NSNumberFormatterCurrencyStyle]; 
[fmtrCurrencyFromStr setGeneratesDecimalNumbers:YES]; 


NSLog(@"Currency Separator: %@", [fmtrCurrencyFromStr decimalSeparator]); //prints a comma 
NSLog(@"Currency Code: %@", [fmtrCurrencyFromStr currencyCode]); //prints EUR 

int currencyScale = [fmtrCurrencyFromStr maximumFractionDigits]; 

NSDecimalNumberHandler *roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:currencyScale raiseOnExactness:FALSE raiseOnOverflow:TRUE raiseOnUnderflow:TRUE raiseOnDivideByZero:TRUE]; 

NSDecimalNumber* currencyNumber = [[NSDecimalNumber alloc] initWithDecimal:[[fmtrCurrencyFromStr numberFromString:strNumber] decimalValue]]; 

NSLog(@"Currency Number = %@", [currencyNumber decimalNumberByRoundingAccordingToBehavior:roundingBehavior]); 

return [currencyNumber decimalNumberByRoundingAccordingToBehavior:roundingBehavior]; 

}

'currencyNumber'변수는 다음과 같이 인쇄됩니다 : 여기

코드입니다, 전달되는 문자열은, 예를 들면 다른 로케일의 경우 코어 데이터에 NSDecimalNumber로 저장하기 위해 2.56을 인쇄합니다.

답변

2

속성을 설정 :

[fmtrCurrencyFromStr setLenient:YES]; 

수정 등 프랑스, ​​독일, 노르웨이, 영국, 미국, 일본, 남 비아의 문제 ... 나는 그것이 모두를 수정 말할 수 없다 나는 천국으로 인해 ' 모든 것을 테스트했지만, 지금까지 테스트 한 모든 것 중에서 효과가있었습니다.

0

생각 문제는

NSDecimalNumber* currencyNumber = [[NSDecimalNumber alloc] initWithDecimal:[[fmtrCurrencyFromStr numberFromString:strNumber] decimalValue]]; 

당신은 generatesDecimalNumbers을 설정 한

NSDecimalNumber * currencyNumber = [fmtrCurrencyFromStr numberFromString:strNumber]; 

대부분-해당 라인으로 교체 시도 라인으로, 그래서 두 사람은 거의 동일 단 하나의 성가신 경우를 제외하고는 : nil.

메시지를 nil로 보내면 아무 것도하지 않으며 대부분의 표준 유형 (정수 (이전 32 비트 런타임에서는 64 비트 정수가 아닌 경우 제외), 부동 소수점 유형, 포인터 유형)이 0으로 반환됩니다. 그것은 메소드가 구조체를 반환하면 초기화되지 않은 메모리를 "반환"합니다. NSDecimal은 구조체입니다.

(근본적인 이유는 본질적으로 런타임이 구조체의 크기를 모르기 때문에 얼마만큼의 메모리가 제로인지 알지 못하기 때문에 "초기화되지 않은"메모리가 대신 사용됩니다. V는 전무 아니라는 것을 확인하지 않고 v.frame을)

편집 :. 물론, NSNumberFormatter가 제대로 가격을 구문 분석하지 않는 이유를 다른 문제입니다. 그것은 힘든 일입니다. 통화 기호를 제거하려고합니다.

0

나는 [formatter setLenient : YES] 플래그를 사용하여 iOS 4.3에서 Euros를 사용함을 확인했다. 이 플래그가 설정되지 않으면 포맷터가 Euros에 대해 올바른 값을 반환하지 않습니다.