【问题标题】:Why isn't the NSNumber class correctly converting my NSString object to a long long?为什么 NSNumber 类不能正确地将我的 NSString 对象转换为 long long?
【发布时间】:2011-04-07 00:58:49
【问题描述】:

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

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

变量songID 包含字符串值@"10359537395704663785"。当我尝试使用语句将其转换为 NSNumber 对象时...

NSNumber *songIDNumber = [NSNumber numberWithLongLong:[songID longLongValue]];

变量songIDNumber 包含错误的9223372036854775807

我做错了什么?还可能值得注意的是,有时此代码确实可以工作并生成正确的 NSNumber 值,但大多数情况下它会失败,如上所示。

提前感谢您的帮助!

更新:天哪,我喜欢这个网站!感谢 unbeli 和 carl,我能够使用更新的代码来修复它,将 NSString 转换为 NSNumber...

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

【问题讨论】:

    标签: iphone ipad nsstring ios nsnumber


    【解决方案1】:

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

    溢出时返回LLONG_MAXLLONG_MIN

    【讨论】:

      【解决方案2】:

      longLongValue returns LLONG_MAX 在溢出的情况下,LLONG_MAX 正是你得到的,9223372036854775807。你的价值根本不适合long long

      尝试改用NSDecimalNumber

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-15
        • 1970-01-01
        • 2014-03-14
        • 2015-03-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多