Objective C Преобразовывает интервал в NSString (iPhone)

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

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

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

9
задан Gilbert 8 July 2014 в 11:26
поделиться

2 ответа

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

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

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

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

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

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

17
ответ дан 4 December 2019 в 09:12
поделиться

Вместо использования собственного кода форматирования строки следует использовать 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: в экземпляре средства форматирования даты.

6
ответ дан 4 December 2019 в 09:12
поделиться