Masato's IT Library

Microsoftの製品・サービスを中心に,色々と書いていきたいと思います

C++で浮動小数点型を書式指定してstd::string型に変換する方法(std::_Floating_to_string)

数値から文字列への変換

C++でプログラムを書いていると,ログ出力などで数値型から文字列に変換したいということがよくあります.

minus9d.hatenablog.com

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の下に表示しているではありませんか

f:id:mst8000:20180125150309p:plain

なにこれ

検索してもまあ情報が出てきません.
const char *_Fmtが何者なのかもわからないので,とりあえず右クリックして定義を表示してみます.

f:id:mst8000:20180125151558p:plain

なるほど,const char *_FmtにはCの書式指定文字列を入れればいいのね, _Ty _Val浮動小数点型の値を渡してあげればいいみたい.

で,ここで少し気になってstd::to_stringの定義をのぞいてみると...

f:id:mst8000:20180125154339p:plain

あった
どうやらto_stringが内部的に使用しているようです.

ということで,

まとめ

std::_Floating_to_string

namespace std {
  string _Floating_to_string(char* fmt, T val)
}

Tはfloat, double, const doubleなどの浮動小数点型

概要

浮動小数点型の数値valfmtの書式で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

バージョン

  • 言語  C++17?
  • 処理系 Visual C++ 2017 (15.5.4)で確認