2016-02-24 3 views
2

Следующий код выводит значения во временном формате, то есть, если это 1:50 и 8 секунд, это будет выход его в качестве 01:50:08Форматирование: как конвертировать 1 в «01», от 2 до «02», от 3 до «03» и т. Д.

cout << "time remaining: %02d::%02d::%02" << hr << mins << secs; 

Но что я хочу сделать, это (а) преобразовать этот Интс на символ/строка (б), а затем добавить один и тот же формат время для его соответствующего значения символа/строки.

Я уже достиг (а), я просто хочу достичь (б).

например.

char currenthour[10] = { 0 }, currentmins[10] = { 0 }, currentsecs[10] = { 0 }; 

    itoa(hr, currenthour, 10); 
    itoa(mins, currentmins, 10); 
    itoa(secs, currentsecs, 10); 

Теперь, если я выход 'currenthour', 'currentmins' и 'currentsecs', он будет выдавать тот же самый пример, как раз, 1: 50: 8, а не 1:50:08.

Идеи?

+1

Ваше первое заявление cout работает? его нет здесь: http://coliru.stacked-crooked.com/a/47f11bcdd5421c21 – NathanOliver

+0

было бы проще, если вы сначала преобразуете значения в time_t? – user3528438

+0

Я предположил, что использование% 02 было стандартной практикой c/C++. Я ошибаюсь? Я использую CryEngine, и этот оператор работает там, но вместо cout CryEngine имеет другую функцию.Для рефери это работает в CryEngine: CryLog («оставшееся время:% 02d ::% 02d ::% 02», ч, мин, сек); – Daqs

ответ

4

Если вы не возражаете, накладные расходы вы можете использовать std::stringstream

#include <sstream> 
#include <iomanip> 

std::string to_format(const int number) { 
    std::stringstream ss; 
    ss << std::setw(2) << std::setfill('0') << number; 
    return ss.str(); 
} 
+1

Я бы сменил ваше вступительное предложение на: «Использовать« std :: stringstream ». Производительность должна быть проблемой только после правильной работы программного обеспечения, но не соответствует ограничениям времени. – RichN

+0

@RichN Не стесняйтесь редактировать мой пост Хотя для меня ФП предложила использовать или потребовать реализацию на довольно низком уровне, поэтому я добавил подсказку о производительности. Тем не менее я полностью согласен с вашими аргументами. – Haatschii

+3

Кто-нибудь проверил этот принятый ответ? ;-) –

3

Как с вашего comment:

«предположил, что я, используя% 02 был стандартный C/C++ практика . Я ошибаюсь?"

Да, вы ошибаетесь. Кроме того, c/C++ - это не то, что это разные языки.

C++ std::cout не поддерживает printf() как форматирование строк. Что вам нужно setw() и setfill():

cout << "time remaining: " << setfill('0') 
    << setw(2) << hr << ':' << setw(2) << mins << ':' << setw(2) << secs; 

Если вы хотите std::string как результат, вы можете использовать std::ostringstream таким же образом:

std::ostringstream oss; 
oss << setfill('0') 
    << setw(2) << hr << ':' << setw(2) << mins << ':' << setw(2) << secs; 
cout << "time remaining: " << oss.str(); 

Также есть подталкивание библиотека boost::format, которая напоминает синтаксис формата строки/места.

0

В качестве альтернативы IOStreams предложила в других ответах, вы можете также использовать безопасное выполнение PRINTF таких как fmt library:

fmt::printf("time remaining: %02d::%02d::%02d", hr, mins, secs); 

Он поддерживает Printf и Python-подобный синтаксис строки формата, где спецификаторы типа могут быть опущено:

fmt::printf("time remaining: {:02}::{:02}::{:02}", hr, mins, secs); 

Отказ от ответственности: Я автор FMT.

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