为什么NSNumber类没有正确地将我的NSString对象转换为long long?

时间:2010-09-01 21:22:51

标签: iphone ipad nsstring ios nsnumber

我正在尝试将NSString对象转换为具有相同数值的NSNumber。当我使用此语句创建NSString对象时...

NSString *songID = [localNotif.userInfo objectForKey:@"SongID"];

var songID包含字符串值@"10359537395704663785"。当我尝试使用语句...

将其转换为NSNumber对象时
NSNumber *songIDNumber = [NSNumber numberWithLongLong:[songID longLongValue]];

var songIDNumber包含错误的9223372036854775807

我做错了什么?值得注意的是,有时这段代码可以正常工作并生成正确的NSNumber值,但大部分时间它都会失败,如上所示。

提前感谢您的帮助!

更新:上帝我爱这个网站!感谢unbeli和carl,我能够使用更新的代码修复它,从NSString转换为NSNumber ......

unsigned long long ullvalue = strtoull([songID UTF8String], NULL, 0);
NSNumber *songIDNumber = [NSNumber numberWithUnsignedLongLong:ullvalue];

2 个答案:

答案 0 :(得分:5)

如果出现溢出,

longLongValue returns LLONG_MAXLLONG_MAX就是你得到的,9223372036854775807。你的价值根本不适合long long < / p>

请尝试使用NSDecimalNumber

答案 1 :(得分:4)

十进制的

9223372036854775807十进制是0x7FFFFFFFFFFFFFFF。您的号码为10359537395704663785,对long long来说太大而且溢出。来自NSString documentation

  

在溢出时返回LLONG_MAXLLONG_MIN