По какой-то странной причине precision
не влияет на целочисленные типы в
iostream
. (Это стандартно, но странно - большая часть
ostream
форматирование основано на printf
, а точность влияет на
выводим интегральные значения туда.)
Очевидный ответ - определить манипулятор, который делает то, что вы хотите.
Что-то вроде:
std::ostream&
timeElement( std::ostream& stream )
{
stream.width( 2 );
stream.fill( '0' );
return stream;
}
Вы можете написать:
ss << timeElement << hours << ':'
<< timeElement << minutes << ':'
<< timeElement << seconds;
Как правило, вы редко используете стандартные манипуляторы. Oни
следует считать больше примером, чем что-либо еще. Но они
представляют физическую разметку, и то, что мы почти всегда хотим, логично
разметки.
Кроме того, не забудьте восстановить исходные флаги форматирования.
состояние, когда вы делаете это. (Я извлекаю все мои манипуляторы из базы
класс, который заботится об этом для меня, восстанавливая значения в его
деструктор. Использование класса здесь будет означать, что вам придется написать
timeElement()
, а не просто timeElement
; когда манипулятор
принимает аргумент, нет никакой разницы.)
Наконец: время и дата - это особые случаи, и я бы на самом деле использовал
strftime
для них. (Но я регулярно использую вышеупомянутую технику только для
обо всем остальном.)