我正在尝试将一个很长的数字(以字符串形式接收)保存到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' - 注意向下舍入的最后一位数。
我做错了什么?
答案 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。