web-dev-qa-db-ja.com

std :: stringstreamで%02dと同等ですか?

printfstd::stringstreamと同等の形式で整数を%02dに出力したい。これを達成する簡単な方法はありますか:

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

(疑似コード)のような、何らかの形式のフラグをstringstreamにストリーミングすることは可能ですか?

stream << flags("%02d") << value;
57
Andreas Brinck

<iomanip>から標準のマニピュレータを使用できますが、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;
}
72
CB Bailey

使用できます

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

標準のC++では、これ以上のことはできません。または、Boost.Formatを使用できます。

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

何らかの形式のフラグをstringstreamにストリーミングすることは可能ですか?

残念ながら、標準ライブラリは書式指定子を文字列として渡すことをサポートしていませんが、 fmt library でこれを行うことができます:

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

または

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

std::stringstreamを構築する必要さえありません。 format関数は、文字列を直接返します。

免責事項:私は fmt library の著者です。

2
vitaut