我有一个应该返回格式化字符串的函数(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的正确语法。它编译和工作,但我没有得到我想要的格式。
我刚刚输入了这个问题,所以如果你看到错别字,请原谅我
答案 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
。 (但我经常使用上述技术
关于其他一切。)