2009-07-25 3 views
22

У меня есть значение unsigned long long, которое я хочу сохранить в NSString и извлечь из строки.Хранение и получение беззнакового длинного длинного значения в/из NSString

Изначально у меня есть значение в NSNumber, и я использую это, чтобы получить строку

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

где тупит является NSNumber.

Чтобы вернуть NSNumber из NSString, я должен сначала получить значение unsigned long long. Но в классе NSString не существует метода для этого (у нас есть только один для получения длинного длинного значения, а не для значения unsigned long long).

Может кто-нибудь скажет мне, как я могу вернуть значение в переменную NSNumber.

Спасибо.

ответ

56

Существует много способов сделать это. Ниже наиболее прагматичным:

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

// .. code and time in between when numStr was created 
// .. and now needs to be converted back to a long long. 
// .. Therefore, numStr used below does not imply the same numStr above. 

unsigned long long ullvalue = strtoull([numStr UTF8String], NULL, 0); 

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

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

Более подробную информацию о strtoull можно найти на его странице руководства.

+1

Отличный ответ. Вы также можете просто прочитать символы в локальной временной строке C (так как символы - это все цифры, не существует проблем с UTF-8 или Unicode), а затем используйте strtoull, чтобы избежать описанного недостатка, но это было бы очень странный случай, когда ваш недостаток был фактической проблемой на практике. –

+0

нет метода unsignedLongLongValue для объекта NSString – Gargo

+0

Чтобы запросить поддержку для чтения значений unsigned из NSString, перейдите на страницу http://bugreport.apple.com и сообщите об ошибке радиолокатора: // 2264733 против компонента 'Foundation | X'. –

Смежные вопросы