我想将一个整数输出到
std::stringstream
,其格式与printf
的%02d
等效。有没有比以下更简单的方法来实现这一目标:
std::stringstream stream;
stream.setfill('0');
stream.setw(2);
stream << value;
是否可以将某种格式标志传输到
stringstream
,例如(伪代码):
stream << flags("%02d") << value;
您可以使用
<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;
}
你可以使用
stream<<setfill('0')<<setw(2)<<value;
在标准 C++ 中你不可能做得更好。或者,您可以使用 Boost.Format:
stream << boost::format("%|02|")%value;
我认为你可以使用c-lick编程。
你可以使用
snprintf
像这样
std::stringstream ss;
char data[3] = {0};
snprintf(data,3,"%02d",value);
ss<<data<<std::endl;
我使用这样的功能:
#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];
}
如果您还包含 iomanip,则此作品有效
#include <iomanip>
#include<sstream>
stream<<setfill('0')<<setw(2)<<value;