Declarations
template < class CharT, class Traits = std::char_traits<CharT> > class basic_format; typedef basic_format<char> format; #ifdef CLX_USE_WCHAR typedef basic_tormat<wchar_t> wformat; #endif template <class Ch, class Tr> std::basic_string<Ch, Tr> str(const basic_format<Ch, Tr>& f);
Overview
format は,C標準ライブラリにおける printf(),sprintf(), fprintf() のような書式付き出力を行うためのクラスです.printf() などとは異なり, format には出力する順番を指定することはできません.format は, 書式文字列を基にして std::ostream に対してマニピュレータを設定することで, printf() などと同じ動きをするように実装しています.
書式文字列には,通常文字と変換指定が存在します.通常文字とは % 以外の文字を表し, 出力ストリームにそのままコピーされます.一方,各変換指定は文字 % で始まり, 変換指定子で終わります.% と変換指定子の間には,0 個以上のフラグ,最小フィールド幅, 精度を(この順序で)記述することができます.
フラグ文字
- #
- x,X 変換の場合先頭に "0x",o 変換の場合先頭に "0" が付加されます.
- 0
- 値をゼロで埋めます.0 と - が両方とも指定された場合は, 0 フラグは無視されます.
- -
- 値をフィールド境界で左揃えにします(デフォルトは右揃え).
- ' '
- (1個の半角スペース)数字の前に空白が置かれます.
- +
- 符号付き変換によって出力される数字の前に,常に符号(+ か -) が置かれます.
フィールド幅
最小のフィールド幅を指定する 10 進数の数字文字列(文字列の最初の文字はゼロ以外) です.本項目は,オプションです.変換された値の文字数がフィールド長よりも少ない場合, フィールドの左側を指定された文字(半角スペース,またゼロ)で埋めます.
精度
オプションである精度は,ピリオド (".") とそれに続く 10 進数という形式で指定します(10 進数はオプション).精度として "." だけが指定された場合,精度はゼロと見なされます.
変換指定子
適用される変換の型を指定する文字.現状,"oxX" 以外の指定子には, 意味がありません.ここで指定した型と実際の引数の型が異なる場合は, 引数の型が優先されます.
- d,i
- int 引数を符号付き 10 進表記に変換します.
- o,u,x,X
- unsigned int 引数を符号なし 8 進数 (o),符号なし 10 進数 (u), 符号なし 16 進数 (x,X) に変換します.x 変換では abcdef が使用され,X 変換では ABCDEF が使用されます.
- e,E
- double 引数を丸めて [-]d.ddde±xx の形に変換します. 小数点の前には一桁の数字があり,小数点以下の桁数は精度で指定された桁数になります. 精度は指定されなかった場合は 6 桁と見なされます.E 変換では,指数を表現するときに E が使用されます.
- f,F
- double 引数を丸めて [-]ddd.ddd の形に変換します.小数点の後の桁数は, 精度で指定された値となります.制度が指定されなかった場合は 6 桁と見なされます.
- g,G
- double 引数を f か e(G 変換の場合は F か E)の形式に変換します. 精度は表示する桁数を指定します.精度が指定されない場合は,6 桁と見なされます.
- c
- unsigned char に変換して,その結果に対応する文字を出力します.
- s
- const char* 型または std::string を引数に取り,その文字列を出力します.
Example
#include <iostream> #include <string> #include <cstdio> #include "clx/format.h" int main(int argc, char* argv[]) { double pi = 3.141592684; std::string hello = "Hello, world. This is a test program"; std::string test = "Output pi with two kinds of format"; std::string fmt = "%s.\n%s: %#+10.7f, %.5e."; std::cout << "Output by using format class." << std::endl; std::cout << "---" << std::endl; std::cout << clx::format(fmt) % hello % test % pi % pi << std::endl; std::cout << std::endl; // compared with the printf() function printf("Output by using printf function\n"); printf("---\n"); printf(fmt.c_str(), hello.c_str(), test.c_str(), pi, pi); std::cout << "Test of str() function" << std::endl; std::cout << "---" << std::endl; std::string dest = clx::str(clx::format(fmt) % hello % test % pi % pi); std::cout << dest << std::endl; return 0; }
Result Output by using format class. --- Hello, world. This is a test program. Output pi with two kinds of format: +3.1415927, 3.14159e+00. Output by using printf function --- Hello, world. This is a test program. Output pi with two kinds of format: +3.1415927, 3.14159e+00. Test of str() function --- Hello, world. This is a test program. Output pi with two kinds of format: +3.1415927, 3.14159e+00.
Template Parameters
- CharT
- 文字の型を指定します.
- Traits
- 文字列を扱うためのtraitsを指定します.デフォルト値は, std::char_traits<CharT>.
Related Types
typedef CharT char_type; typedef unsigned int size_type; typedef typename std::basic_string<CharT, Traits> string_type;
Construction and Member Functions
basic_format() explicit basic_format(const char_type* fmt); explicit basic_format(const string_type& fmt); template <class ValueT> basic_format& operator%(const ValueT& x); string_type str() const; template <class Ch, class Tr> friend std::basic_ostream<Ch, Tr>& operator<<( std::basic_ostream<Ch, Tr>& sout, const basic_format<Ch, Tr>& f);