字符串流格式语法
stringsteam format syntax
我有一个函数,它应该返回一个格式化的字符串(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。(但我经常使用上述技巧关于其他一切。)
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 助记符和指向成员语法的指针
- 有人能分解一下这个c++模板的语法吗
- C++避免重复声明的语法是什么
- 如何在openssl-ecc中获取十六进制格式的私钥
- QMetaObject invokeMethod的基于函数指针的语法
- 将"打开的CV图像"中的"颜色"转换为整数格式
- TDateTime格式在C++Builder中不会更改
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 检查不带转换的扫描格式
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- 是否可以从格式字符串中检索"width"
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- clang格式:宏的缩进
- clang格式:禁用排序包含
- 将信息输入到下面显示的结构向量中的正确语法/格式是什么
- 在 boost::log 中使用格式语法
- 字符串流格式语法
- 在MFC上选择多个UINT格式时出现语法错误