2011-06-13 12 views
3

我试图将一个很长的数字(如字符串接收),如'80182916772147201'保存到NSNumber中。试图从字符串节省很长时间到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' - 注意舍去最后一位。

我在做什么错?

回答

3

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

[f setAllowsFloats:NO]; 
+0

完美,谢谢:) – mootymoots 2011-06-13 09:36:46

2

你可以试试吗?

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

这使得一些合理的假设,如numStr将只包含位数字,它包含一个“有效”无符号很长很长的价值。这种方法的一个缺点是UTF8String创建的内容基本相当于[[numStr dataUsingEncoding:NSUTF8StringEncoding]字节],或者换句话说,每个调用的内容都是32字节的自动释放内存。对于绝大多数用途来说,这是没有问题的。

有关如何将诸如unsignedLongLongValue之类的东西添加到NSString中的例子,它非常快并且不会使用自动释放内存作为副作用,请查看我的(长)回答这个SO问题的结尾。特别是rklIntValue的示例实现,它只需要微小的修改即可实现unsignedLongLongValue。