C++で浮動小数点型を書式指定してstd::string型に変換する方法(std::_Floating_to_string)
数値から文字列への変換
C++でプログラムを書いていると,ログ出力などで数値型から文字列に変換したいということがよくあります.
C++では,例えば,12345
という数値をstd::string型の文字列に変換するには
std::to_string(12345)
とするだけです.お手軽.
ただ,上の記事でもあるように,C時代のfprintfのように,C++の標準ライブラリを用いた浮動小数点型への詳細な書式指定をした数値から文字列への変換は出来ないとされていました.
そのため,Cみたいにfprintf_s()使ってchar[]な文字列にしてからstringに変換するのを書くのもC++的になんか野暮ったいなあと思い
double doubleNum = 3.1415926535; int digits = 3; std::ostringstream oss; oss << std::fixed << std::setprecision(digits) << doubleNum; std::string stringNum = oss.str(); // stringNumは "3.141" になる
みたいに書いていました.
ところが,Visual Studio 2017(v15.5.4)で何気なくいつも通りstd::to_stringなどと打っていたら,
intellisenseが何やら気になるものをto_stringの下に表示しているではありませんか
なにこれ
検索してもまあ情報が出てきません.
const char *_Fmt
が何者なのかもわからないので,とりあえず右クリックして定義を表示してみます.
なるほど,const char *_Fmt
にはCの書式指定文字列を入れればいいのね,
_Ty _Val
は浮動小数点型の値を渡してあげればいいみたい.
で,ここで少し気になってstd::to_string
の定義をのぞいてみると...
あった
どうやらto_string
が内部的に使用しているようです.
ということで,
まとめ
std::_Floating_to_string
namespace std { string _Floating_to_string(char* fmt, T val) }
T
はfloat, double, const doubleなどの浮動小数点型
概要
浮動小数点型の数値val
をfmt
の書式でstring
型の文字列に変換する.
戻り値
各数値型に対して、sprintf_s(buf, len, fmt, val)
によって生成された文字列のstring
オブジェクトを返す.
バッファサイズはフォーマットと渡された値から適切に計算される.
例
double doubleNum = 3.1415926535; std::cout << std::_Floating_to_string("%.3f", doubleNum) << std::endl; std::cout << std::_Floating_to_string("%10.5f", doubleNum) << std::endl;
出力
3.141 3.14159