相当于 %02d 与 std::stringstream?

Posted

技术标签:

【中文标题】相当于 %02d 与 std::stringstream?【英文标题】:Equivalent of %02d with std::stringstream? 【发布时间】:2010-05-15 09:21:35 【问题描述】:

我想用printf%02d 的等效格式将整数输出到std::stringstream。有没有比以下更简单的方法来实现这一点:

std::stringstream stream;
stream.setfill('0');
stream.setw(2);
stream << value;

是否可以将某种格式标志流式传输到stringstream,例如(伪代码):

stream << flags("%02d") << value;

【问题讨论】:

不应该是stream.fill('0')stream.width(2) 吗?您使用操纵器的名称几乎就像您知道自己问题的答案一样? 【参考方案1】:

您可以使用来自 &lt;iomanip&gt; 的标准操纵器,但没有一个可以同时执行 fillwidth 的简洁操纵器:

stream << std::setfill('0') << std::setw(2) << value;

编写自己的对象在插入流中时执行两个功能并不难:

stream << myfillandw( '0', 2 ) << value;

例如

struct myfillandw

    myfillandw( char f, int w )
        : fill(f), width(w) 

    char fill;
    int width;
;

std::ostream& operator<<( std::ostream& o, const myfillandw& a )

    o.fill( a.fill );
    o.width( a.width );
    return o;

【讨论】:

【参考方案2】:

你可以使用

stream<<setfill('0')<<setw(2)<<value;

【讨论】:

【参考方案3】:

在标准 C++ 中你不能做得更好。或者,您可以使用 Boost.Format:

stream << boost::format("%|02|")%value;

【讨论】:

如果您没有将stream 用于其他任何内容,则不需要它,因为boost::format 已经生成了一个字符串。 我听说你必须把它传递给str(...)然后 Jahonnes 你可以使用 std::string myStr = (boost::format("%|02|")%value).str();【参考方案4】:

是否可以将某种格式标志流式传输到stringstream

不幸的是,标准库不支持将格式说明符作为字符串传递,但您可以使用fmt library:

std::string result = fmt::format(":02", value); // Python syntax

std::string result = fmt::sprintf("%02d", value); // printf syntax

你甚至不需要构造std::stringstreamformat 函数会直接返回一个字符串。

免责声明:我是fmt library的作者。

【讨论】:

【参考方案5】:

我认为你可以使用 c-lick 编程。

你可以使用snprintf

喜欢这个

std::stringstream ss;
 char data[3] = 0;
 snprintf(data,3,"%02d",value);
 ss<<data<<std::endl;

【讨论】:

以上是关于相当于 %02d 与 std::stringstream?的主要内容,如果未能解决你的问题,请参考以下文章

存储用户、错误、异常消息 (c++)

QString与std::string 有中文时的转换操作

(默认)为每个可变参数类型构造一个对象

Qt Qstring与c++标准string 的转化

std::string字符串中间存放‘

std::string字符串中间存放‘