C++11以降のstd::to_string()
に精度指定機能を付けたもの相当のテンプレート函数です。
C++20以降にはstd::format
があるのでもう需要はないかもしれませんが、ctl::jsonがこのライブラリを内包しているので単体版もリリースすることにしました。
動作確認済みコンパイラのうちもっとも古いものはVC++2005です。
ctlstring.hpp
をincludeし、ctl::to_string<AnyStringType>(Number, a2, a3)
を呼びます。最初の引数 Number
には文字列化したい数値を指定し、テンプレート引数 AnyStringType
には戻り値の型、つまり文字列化されたものの型を指定します。
第2、第3引数(a2
とa3
)は省略可能で、それぞれの意味は最初の引数の型によって変わります(整数型か浮動小数型か)。
文字列化する値として第1引数に整数型の値が指定された時、第2、第3引数は次のように解釈されます。
第2引数以降は省略可能です。
文字列化した数値を何型で返すかは、テンプレート引数の第1引数で指定します。
// 第1引数が整数系の値の場合。 template <typename stringT, typename T> stringT to_string(T value, int base = 10, int precision = 1); // 使用例。 std::string s = ctl::to_string<std::string>(123, -16, 4); // std::string("007B") が返ってくる。
第2引数base
に11~36が指定された場合、10以上の数値を表すのに既定では小文字のaからzが使われます。大文字を使いたい場合は第2引数を負数で指定します(例えば-16なら、16進数で、10以上の数値には大文字の "ABCDEF" が使われる)。
文字列化されたものの桁数が第3引数で指定した値未満の場合、不足している桁数は0
で埋められます。
第1引数が浮動小数型の場合は、第2、第3引数の意味が次のように解釈されます。
'e'
/'E'
, 'f'
/'F'
, 'g'
/'G'
'a'
/'A'
が使用可能で、意味はそれぞれprintf()
系の "%e"
/"%E"
, "%f"
/"%F"
, "%g"
/"%G"
, "%a"
/"%A"
に同じ。省略時は 'f'
が使われる。
つまり printf()
系の書式 "%.PT'
の P
部分 (precision) を第3引数で、T
部分 (type) を第2引数で指定するということです。
テンプレート引数の第1引数で戻り値の方を指定するのは上に同じです。
// 第1引数が浮動小数系の値の場合。
template <typename stringT>
stringT to_string(double val, const int fmt = 'f', const int precision = 6);
template <typename stringT>
stringT to_string(float val, const int fmt = 'f', const int precision = 6);
template <typename stringT>
stringT to_string(long double val, const int fmt = 'f', const int precision = 6);
第3引数に負数が指定された場合、絶対値化した上で文字列化後に小数点以下の末尾にある0を削除します。
当ライブラリ既定のnamespace
はctl
ですが、あらかじめ#define NAMESPACE_CTLSTRING ~
を定義しておくことにより変更することも出来ます。