Почему класс NSNumber неправильно конвертирует мой объект NSString в long long? - PullRequest
5 голосов
/ 02 сентября 2010

Я пытаюсь преобразовать объект 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];

Ответы [ 2 ]

5 голосов
/ 02 сентября 2010

longLongValue возвращает LLONG_MAX в случае переполнения, и LLONG_MAX это именно то, что вы получаете, 9223372036854775807. Ваше значение просто не вписывается в long long

Попробуйте использовать NSDecimalNumber .

4 голосов
/ 02 сентября 2010

9223372036854775807 десятичное значение 0x7FFFFFFFFFFFFFFF в шестнадцатеричном формате.Ваш номер 10359537395704663785, который слишком велик для long long и переполнен.Из документации NSString :

Возвращает LLONG_MAX или LLONG_MIN при переполнении.

...