#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.