Пытаюсь сохранить long long в NSNumber из строки

#iphone #ios #nsstring #nsnumber #nsnumberformatter

#iPhone #iOS #nsstring #nsnumber #nsnumberformatter

Вопрос:

Я пытаюсь сохранить длинный длинный номер (полученный в виде строки), такой как ‘80182916772147201’, в 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’ — Обратите внимание на округленную в меньшую сторону конечную цифру.

Что я делаю не так?

Ответ №1:

Проблема в том, что NSNumberFormatter было решено представить это число как число с плавающей запятой. Чтобы заставить его использовать только целые числа:

 [f setAllowsFloats:NO];
  

Ответ №2:

Можете ли вы попробовать это?

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

Это делает несколько разумных предположений, таких как numStr, которые будут содержать только числовые цифры и «допустимое» значение long long без знака. Недостатком этого подхода является то, что UTF8String создает то, что по сути составляет [[numStr dataUsingEncoding:NSUTF8StringEncoding] байт], или, другими словами, что-то вроде 32 байт автоматически освобождаемой памяти на вызов. Для подавляющего большинства применений это не проблема, какой бы она ни была.

Для примера того, как добавить что-то вроде unsignedLongLongValue в NSString, которое выполняется очень быстро и не использует автоматически освобождаемую память в качестве побочного эффекта, взгляните на конец моего (длинного) ответа на этот вопрос SO. В частности, пример реализации rklIntValue , для реализации которого потребовались бы только тривиальные модификации unsignedLongLongValue.