2012-03-10 2 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.2.2.2.2.2.2.2.2 Затем я получаю правильный номер, то есть "номер: 12345674567859,2" "строка перевода: +12345674567859,2"

с: +12345674567859,23 я получаю: "номер: 12345674567859,23" "строка перевода: 12345674567859,2"

но: я получаю это: "номер: 1234567456785921" "строка перевода: 1234567456785920"

это внутренняя граница nsnumberformatter, потому что в документации ничего не говорится об этом, или я делаю что-то неправильно?

ответ

0

Я думаю, что проблема не находится в пределе NSNumberFormatter, она находится в пределе самого двойника.

Максимальное значение double в Objective-C составляет 15 цифр, я думаю, что это хорошая подсказка о том, что происходит в вашей программе.

Я думаю, что когда вы делаете это

[NSNumber numberWithDouble:[tempString doubleValue]]]; 

Вы ограничиваете значение NSNumber, потому что doubleValue будет предела!

+0

Я думал об этом, но, как вы можете видеть в моем сообщении, NSLog (@ "number:% @", [NSNumber numberWithDouble: [tempString doubleValue]]); печатает правильное значение без какого-либо усечения.Он начинает усекать, когда цифры больше 16. – Cpu86

+0

У вас пытались использовать [numberFormatter setMaxium:], то? Вы также можете получить доступ к максимальному значению и узнать его значение –

+0

Я попробовал [numberFormatter setMaxium: nil], но ничего не изменилось. – Cpu86

1

Не могли бы вы проверить, что представляет собой фактический класс номера? Это NSNumber или NSDecimalNumber?

A NSNumber подкрепляется double и не может содержать более 15 значащих десятичных цифр. С другой стороны, NSDecimalNumber использует десятичную арифметику и может содержать до 32 значащих цифр.

Я уже узнал, что NSDecimalFormatter не может правильно отформатировать NSDecimalNumber s (см. iOS: formatting decimal numbers). Но, возможно, он может правильно создать NSDecimalNumber из строки.

Смежные вопросы