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 ~を定義しておくことにより変更することも出来ます。