2012-03-10 6 views
3

큰 숫자의 서식을 지정하는 데 문제가 있습니다.NSNumberFormatter iOS 큰 배 값

처음 숫자와 내가 문자열을 저장해야하기 때문에 문자열을 포맷

, 난 그것에서 stringValue를 얻을 :

formatter = [[NSNumberFormatter alloc] init]; 
[formatter setLocale:[NSLocale currentLocale]]; 
[formatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
[formatter setUsesSignificantDigits:NO]; 
[formatter setMaximumFractionDigits:6]; 
[formatter setMinimumFractionDigits:0]; 
[formatter setGroupingSeparator:@""]; 
value = [formatter numberFromString:textField.text]; 
label = [value stringValue] 

및 모든 즉, 내가 123456745678592.6을 입력하면, 괜찮습니다, 나는거야 123456745678592.6.

numberFormatter = [[NSNumberFormatter alloc] init]; 
[numberFormatter setLocale:[NSLocale currentLocale]]; 
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; 
[numberFormatter setGroupingSeparator:@""]; 
[numberFormatter setUsesSignificantDigits:NO]; 
[numberFormatter setMinimumFractionDigits:0]; 
[numberFormatter setMaximumFractionDigits:6]; 
tempString = myNumberString; 
NSLog(@"number: %@",[NSNumber numberWithDouble:[tempString doubleValue]]); 
tempString = [numberFormatter stringFromNumber:[NSNumber numberWithDouble:[tempString doubleValue]]]; 
NSLog(@"string translated: %@",tempString); 

그리고 난이 얻을 :

그럼 때문에 다른 로케일의 문자열을 포맷했습니다 "번호 : 123456745678592.6" "문자열이 번역 : 123456745678593"

이 반올림 때 발생을 의미있는 자릿수는 15보다 큽니다.

내가 입력하면 : 12345674567859.2 다음 올바른 번호, 즉 0123을 얻습니다"번호 : 12345674567859.2" "번역 된 문자열 : 12345674567859.2"

과 : 12345674567859.23 내가 얻을 : "번호 : 12345674567859.23" "번역 된 문자열 : 12345674567859.2"

만에 : 내가 얻을 이 : "번호 : 1234567456785921" "1234567456785920"

이 값은 nsnumberformatter의 본질적인 제한이며, 문서가 이것에 관해서 아무것도 말하지 않았기 때문에, 또는 나는 무엇인가 잘못하고있다?

답변

0

나는 문제가 NSNumberFormatter의 한계에 있지 않다고 생각한다. 이중 한계의 한계에있다.

Objective-C의 최대 값은 15 자입니다. 프로그램에서 무슨 일이 일어나고 있는지에 대한 좋은 단서라고 생각합니다.

내가 생각하는 당신이있는 doubleValue이 제한을해야 할 것입니다 때문에 당신의의 NSNumber의 값을 제한하고이

[NSNumber numberWithDouble:[tempString doubleValue]]]; 

을 수행 할 때!

+0

내 생각에 내 게시물 NSLog (@ "number : % @", [NSNumber numberWithDouble : [tempString doubleValue]])에서 알 수 있듯이 이것에 대해 생각했습니다. 잘리지 않고 올바른 값을 인쇄합니다.숫자가 16보다 클 때 자르기 시작합니다. – Cpu86

+0

[numFormatter setMaxium :]을 사용해 보았습니까? 최대 값에 액세스하여 그 값을 읽을 수도 있습니다 –

+0

[numberFormatter setMaxium : nil] 시도했지만 아무 것도 변경되지 않았습니다. – Cpu86

1

숫자의 실제 클래스가 무엇인지 확인할 수 있습니까? NSNumber 또는 NSDecimalNumber입니까?

NSNumberdouble으로 백업되며 15 자 이상의 10 진수를 초과 할 수 없습니다. 반면에 NSDecimalNumber은 십진수 산술을 사용하며 최대 유효 자릿수는 32 자까지 가능합니다.

NSDecimalFormatterNSDecimalNumber을 올바르게 포맷 할 수 없음을 알았습니다 (iOS: formatting decimal numbers 참조). 하지만 문자열에서 정확하게 NSDecimalNumber을 만들 수 있습니다.