试图从String中保存很长时间到NSNumber

时间:2011-06-13 09:23:38

标签: iphone ios nsstring nsnumber nsnumberformatter

我正在尝试将一个很长的数字(以字符串形式接收)保存到NSNumber中,例如'80182916772147201'。

NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterBehaviorDefault];

[item setObject:[f numberFromString:@"80182916772147201"] forKey:@"theID"];
[f release];

当我对此进行NSLog时,假设该字符串为'80182916772147201',我得到:

NSLog(@"%lld", [[item objectForKey:@"theID"] longLongValue]); 

返回:'80182916772147200' - 注意向下舍入的最后一位数。

我做错了什么?

2 个答案:

答案 0 :(得分:3)

问题是NSNumberFormatter已决定将该数字表示为浮点数。强制它仅使用整数:

[f setAllowsFloats:NO];

答案 1 :(得分:2)

你能试试吗?

NSString *numStr = [NSString stringWithFormat:@"%llu", [myNum unsignedLongLongValue]];

这使得一些合理的假设(例如numStr)将仅包含数字,并且它包含“有效”的无符号long long值。这种方法的一个缺点是UTF8String创建的内容实际上相当于[[numStr dataUsingEncoding:NSUTF8StringEncoding] bytes],换句话说,就是每次调用32字节自动释放内存的行。对于绝大多数用途来说,这不是什么问题。

有关如何向NSString添加unsignedLongLongValue等非常快且不使用自动释放内存作为副作用的示例,请看一下这个SO问题的(长)答案的结尾。特别是rklIntValue的示例实现,它只需要进行简单的修改即可实现unsignedLongLongValue。