格式化大数字时遇到问题。
我首先将字符串格式化为数字,因为我需要保存字符串,我从中获取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 然后我得到正确的号码,即 “号码:12345674567859.2” “字符串翻译:12345674567859.2”
使用: 12345674567859.23 我得到: “号码:12345674567859.23” “字符串翻译:12345674567859.2”
但是: 1234567456785921 我明白了: “号码:1234567456785921” “字符串翻译:1234567456785920”
这是nsnumberformatter的内在限制,因为文档没有说明这一点,或者我做错了什么?
答案 0 :(得分:1)
你能检查这个号码的实际等级是什么吗?是NSNumber
还是NSDecimalNumber
?
NSNumber
由double
备份,并且不能包含超过15个有效小数位数。另一方面,NSDecimalNumber
使用十进制算术,最多可以包含32位有效数字。
我已经了解到NSDecimalFormatter
无法正确格式化NSDecimalNumber
(请参阅iOS: formatting decimal numbers)。
但也许它可以从字符串中正确地创建NSDecimalNumber
。
答案 1 :(得分:0)
我认为问题不在于NSNumberFormatter的限制,它本身就是双倍的限制。
Objective-C中double的最大值是15位数,我认为这是关于程序中发生的事情的一个很好的线索。
我认为当你这样做时
[NSNumber numberWithDouble:[tempString doubleValue]]];
您正在限制NSNumber的值,因为doubleValue将有一个限制!