NSNumberFormatter iOS大双值

时间:2012-03-10 14:44:51

标签: objective-c ios cocoa-touch

格式化大数字时遇到问题。

我首先将字符串格式化为数字,因为我需要保存字符串,我从中获取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的内在限制,因为文档没有说明这一点,或者我做错了什么?

2 个答案:

答案 0 :(得分:1)

你能检查这个号码的实际等级是什么吗?是NSNumber还是NSDecimalNumber

NSNumberdouble备份,并且不能包含超过15个有效小数位数。另一方面,NSDecimalNumber使用十进制算术,最多可以包含32位有效数字。

我已经了解到NSDecimalFormatter无法正确格式化NSDecimalNumber(请参阅iOS: formatting decimal numbers)。 但也许它可以从字符串中正确地创建NSDecimalNumber

答案 1 :(得分:0)

我认为问题不在于NSNumberFormatter的限制,它本身就是双倍的限制。

Objective-C中double的最大值是15位数,我认为这是关于程序中发生的事情的一个很好的线索。

我认为当你这样做时

[NSNumber numberWithDouble:[tempString doubleValue]]];

您正在限制NSNumber的值,因为doubleValue将有一个限制!