Форматирование: как преобразовать 1 в «01», 2 в «02», 3 в «03» и т. Д.

Следующий код выводит значения в формате времени, то есть, если это 1:50 вечера и 8 секунд, он будет выводить его как 01:50:08

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, а не 01:50:08.

Идеи?

2

Решение

Если вы не против накладных расходов, вы можете использовать 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();
}
4

Другие решения

Как из вашего комментарий:

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

Да вы не правы Также с / с ++ не вещь, это разные языки.

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 доступно, что напоминает формат строки / синтаксис заполнителя.

3

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

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

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

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

отказЯ автор fmt.

0
По вопросам рекламы [email protected]