Попытка сохранить длинный длинный в NSNumber из String - PullRequest
3 голосов
/ 13 июня 2011

Я пытаюсь сохранить длинный длинный номер (полученный в виде строки), такой как '80182916772147201', в NSNumber.

NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterBehaviorDefault];

[item setObject:[f numberFromString:@"80182916772147201"] forKey:@"theID"];
[f release];

Когда я NSLog это, предположив, что строка была '80182916772147201' Iget:

NSLog(@"%lld", [[item objectForKey:@"theID"] longLongValue]); 

Возвраты: '80182916772147200' - обратите внимание на округленную в сторону уменьшения последнюю цифру.

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

Ответы [ 2 ]

3 голосов
/ 13 июня 2011

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

[f setAllowsFloats:NO];
2 голосов
/ 13 июня 2011

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

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

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

Например, как добавить нечто вроде unsignedLongLongValue в NSString, которое очень быстро и не использует автоматически высвобождаемую память в качестве побочного эффекта,взгляните на конец моего (длинного) ответа на этот ТАК вопрос.В частности, пример реализации rklIntValue, который потребует только тривиальных изменений для реализации unsignedLongLongValue.

...