stringstream格式语法

时间:2012-01-20 03:53:41

标签: c++ iostream

我有一个应该返回格式化字符串的函数(hh:mm:sec.xxx) 我希望输出显示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 个答案:

答案 0 :(得分:2)

你忘记了几分钟,你可能想要0小数精度。尝试:

ss << std::setw(2) << std::setfill('0') << std::setprecision(0) << hours << ":" 
   << mins << ":" 
   << std::setprecision(3) << secs; 

答案 1 :(得分:1)

对于您的整数字段,您可以使用std::setw(2)设置字段宽度,并将std::setfill('0')设置为零填充。

答案 2 :(得分:0)

由于某些奇怪的原因,precision对整数类型没有影响 iostream。 (这是标准的,但很奇怪 - 很多 ostream格式基于printf,精度会影响。{1}} 那里输出积分值。)

显而易见的答案是定义一个符合你想要的操纵器。 有点像:

std::ostream&
timeElement( std::ostream& stream )
{
    stream.width( 2 );
    stream.fill( '0' );
    return stream;
}

然后你可以写:

ss << timeElement << hours << ':'
   << timeElement << minutes << ':'
   << timeElement << seconds;

作为一般规则,您很少使用标准操纵器。他们 应该被视为一个例子而不是其他任何东西。但是他们 表示物理标记,我们几乎总是想要的是逻辑的 标记。

另外,不要忘记将格式化标志恢复为原始格式 当你这样做时说。 (我从基地派生出所有的操纵者 为我照顾这个的类,恢复它的值 析构函数。在这里使用一个类意味着你必须写 timeElement(),而不仅仅是timeElement;当操纵者 采取论据,没有区别。)

最后:时间和日期是特殊情况,我实际上是在使用 他们strftime。 (但我经常使用上述技术 关于其他一切。)