字符串流格式语法

stringsteam format syntax

本文关键字:语法 格式 字符串      更新时间:2023-10-16

我有一个函数,它应该返回一个格式化的字符串(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的小数精度。尝试:

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

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

由于一些奇怪的原因,precision对中的积分类型没有影响iostream。(这是标准的,但很奇怪&mdashostream格式基于printf,精度会影响在那里输出积分值。)

显而易见的答案是定义一个可以执行您想要的操作的操纵器。大致如下:

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

然后你可以写:

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

一般来说,很少使用标准操纵器。他们应该更多地被视为一个例子。但是他们表示物理标记,而我们几乎总是想要的是合乎逻辑的加成

另外,别忘了将格式化标志恢复为原来的格式说明何时执行此操作。(我所有的操纵器都来自一个基为我处理此问题的类,恢复其析构函数。在这里使用类意味着你必须写作timeElement()而不仅仅是timeElement;当操纵器接受一个论点,没有区别。)

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