Цель C Преобразовать int в NSString (iPhone) - PullRequest
9 голосов
/ 05 марта 2010

У меня есть следующий код, который предназначен для преобразования миллисекунд в часы, минуты и секунды:

int hours = floor(rawtime / 3600000);

int mins = floor((rawtime % 3600000) / (1000 * 60));
int secs = floor(((rawtime % 3600000) % (1000 * 60)) / 1000);

NSLog(@"%d:%d:%d", hours, mins, secs);

NSString *hoursStr = [NSString stringWithFormat:@"%d", hours];
NSString *minsStr = [NSString stringWithFormat:@"%d", mins];
NSString *secsStr = [NSString stringWithFormat:@"%d", secs];

NSLog(@"%a:%a:%a", hoursStr, minsStr, secsStr);

Довольно просто.Rawtime представляет собой целое число со значением 1200. Вывод выглядит так:

0:0:1

0x1.3eaf003d9573p-962:0x1.7bd2003d3ebp-981:-0x1.26197p-698

Почему преобразование целых чисел в строки дает такие дикие числа?Я пытался использовать% I и% U, и они не имели никакого значения.Что происходит?

Ответы [ 2 ]

17 голосов
/ 05 марта 2010

Вы должны использовать %@ в качестве спецификатора преобразования для строки NSString. Измените свою последнюю строку на:

NSLog(@"%@:%@:%@", hoursStr, minsStr, secsStr);

%a означает что-то совершенно другое. Из справочной страницы printf() :

аА
Двойной аргумент округляется и преобразуется в шестнадцатеричное представление в стиле

[-]0xh.hhhp[+-]d

где число цифр после символа шестнадцатеричной точки равно спецификации точности.

6 голосов
/ 05 марта 2010

Вместо использования собственного кода форматирования строки следует использовать NSNumberFormatter для чисел или NSDateFormatter для дат / времени.Эти средства форматирования данных заботятся о локализации формата в соответствии с региональными настройками пользователя и поддерживают различные встроенные форматы.

Для использования вам необходимо преобразовать миллисекунду в NSTimeInterval (typedef 'd от двойного):

NSTimeInterval time = rawtime/1e3;

Теперь вы можете использовать NSDateFormatter для представления времени:

NSDate *timeDate = [NSDate dateWithTimeIntervalSinceReferenceDate:time];
NSString *formattedTime = [NSDateFormatter localizedStringFromDate:timeDate
                                                         dateStyle:NSDateFormatterNoStyle 
                                                         timeStyle:NSDateFormatterMediumStyle];
NSString *rawTime = [[formattedTime componentsSeparatedByString:@" "] objectAtIndex:0];

в OS X, где последняя строка удаляет «AM / PM»».Это будет работать в любое время менее 12 часов и даст отформатированную строку в локализованном формате для ЧЧ: ММ: СС.На iPhone localizedStringFromDate:dateStyle:timeStyle: недоступен (пока).Вы можете достичь того же эффекта с помощью setTimeStyle:, setDateStyle: и stringFromDate: в экземпляре средства форматирования даты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...