ctl::to_string

概要

 C++11以降のstd::to_string()に精度指定機能を付けたもの相当のテンプレート函数です。
 C++20以降にはstd::formatがあるのでもう需要はないかもしれませんが、ctl::jsonがこのライブラリを内包しているので単体版もリリースすることにしました。

 動作確認済みコンパイラのうちもっとも古いものはVC++2005です。

Download

使い方

 ctlstring.hppをincludeし、ctl::to_string<AnyStringType>(Number, a2, a3) を呼びます。最初の引数 Number には文字列化したい数値を指定し、テンプレート引数 AnyStringType には戻り値の型、つまり文字列化されたものの型を指定します。

 第2、第3引数(a2a3)は省略可能で、それぞれの意味は最初の引数の型によって変わります(整数型か浮動小数型か)。

整数型

 文字列化する値として第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引数の意味が次のように解釈されます。

 つまり 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

 当ライブラリ既定のnamespacectlですが、あらかじめ#define NAMESPACE_CTLSTRING ~を定義しておくことにより変更することも出来ます。