%02d 与 std::stringstream 等价?

问题描述 投票:0回答:7

我想将一个整数输出到

std::stringstream
,其格式与
printf
%02d
等效。有没有比以下更简单的方法来实现这一目标:

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

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

stringstream
,例如(伪代码):

stream << flags("%02d") << value;
c++ formatting stringstream
7个回答
85
投票

您可以使用

<iomanip>
中的标准操纵器,但没有一个简洁的操纵器可以同时执行
fill
width
操作:

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;
}

12
投票

你可以使用

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

11
投票

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

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

6
投票

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

stringstream

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

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

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

您甚至不需要构建

std::stringstream
format
函数将直接返回一个字符串。

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


0
投票

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

你可以使用

snprintf

像这样

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

0
投票

我使用这样的功能:

#include <stdio.h>
#include <stdarg.h>
#include <cstdio>

const char * sformat(const char * fmt, ...)
{
    static char buffer[4][512]; // nesting less than 4x, length less then 512
    static int i = -1;
    if(++i > 3) i = 0;
    va_list args;
    va_start(args, fmt);
    std::vsnprintf(buffer[i], 511, fmt, args);
    va_end(args);
    return buffer[i];
}

0
投票

如果您还包含 iomanip,则此作品有效

#include <iomanip>
#include<sstream>
stream<<setfill('0')<<setw(2)<<value;
© www.soinside.com 2019 - 2024. All rights reserved.