синтаксис формата stringsteam - PullRequest
       19

синтаксис формата stringsteam

0 голосов
/ 20 января 2012

У меня есть функция, которая должна возвращать отформатированную строку (чч: мм: сек.ххх). Я хочу, чтобы вывод отображал 2 места для часов, 2 места для минут и 5 мест для секунд (усеченные микросекунды);

Мой код:

#include <iostream>
#include <iomanip>

std::string getTime(uint64_t time){ //input is in microseconds

unit64_t tempTime = time;
unit64_t hours = (tempTime / 3600000000);
tempTime -= (hours * 3600000000);

unit64_t mins = (tempTime / 60000000);
tempTime -= (mins * 60000000);

double secs = ((double)tempTime / 1000000);

std::string strTime;

 stringstream ss;
 ss << std::setprecision(2)<<hours<<":"
    << std::setprecision(2)<<mins <<":"
    << std::setprecision(2)<<std::setprecision(2)<<secs; 

 strTime = ss.str();
 return strTime;

}

Может кто-нибудь показать мне правильный синтаксис для ввода значений в ss.Он компилируется и работает, но я не получаю нужный мне формат.

Я только что набрал это для этого вопроса, так что если вы видите опечатки, пожалуйста, прости меня

Ответы [ 3 ]

2 голосов
/ 20 января 2012

Вы забыли о минутах и, возможно, хотите получить точность до 0. Попробуйте:

ss << std::setw(2) << std::setfill('0') << std::setprecision(0) << hours << ":" 
   << mins << ":" 
   << std::setprecision(3) << secs; 
1 голос
/ 20 января 2012

Для ваших целочисленных полей вы можете использовать std::setw(2) для установки ширины поля и std::setfill('0') для нуля слева.

0 голосов
/ 20 января 2012

По какой-то странной причине 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 для них. (Но я регулярно использую вышеупомянутую технику только для обо всем остальном.)

...