3

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

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' - 注意四舍五入的最终数字。

我究竟做错了什么?

4

2 回答 2

3

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

[f setAllowsFloats:NO];
于 2011-06-13T09:34:42.790 回答
2

你能试试这个吗?

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

这做出了一些合理的假设,例如 numStr 将只包含数字,并且它包含一个“有效的”无符号 long long 值。这种方法的一个缺点是 UTF8String 创建的内容基本上相当于 [[numStr dataUsingEncoding:NSUTF8StringEncoding] 字节],或者换句话说,每次调用都会产生 32 个字节的自动释放内存。对于绝大多数用途来说,这从来都不是问题。

有关如何将诸如 unsignedLongLongValue 之类的内容添加到 NSString 的示例,该内容既非常快又不使用自动释放的内存作为副作用,请查看我对这个 SO 问题的(长)答案的结尾。特别是 rklIntValue 的示例实现,它只需要简单的修改即可实现 unsignedLongLongValue。

于 2011-06-13T09:33:26.910 回答