C++で数値のフォーマット方法まとめ

C++で数値→文字列や文字列→数値の変換をするとき、様々な方法があってよく分からなくなることがあるので、知っている範囲でまとめてみました。
Javaだったらだいたい「DecimalFormat使っとけ」で一発なんだけどなあ。


注意点

  • 基本的に文字列をcharで扱う関数を取り上げていますが、たいがいの関数にはwchar_tバージョンもあります(関数名のどっかにwが入っている)
  • ロケールを指定できるバージョンがある関数も多いです(関数名末尾に_lが付いてる)
  • セキュリティが強化されたバージョン(関数名末尾に_sとかが付いてる)があるやつはそっちを使いましょう
  • リンク先はMSDNのリファレンスです

文字列→整数

  • atoi
    • 数値として認識される文字列を正規表現で書くと \s*[+-]?\d+
    • 解釈できない文字が現れた時点で停止する
    • 数値に変換できない場合は0を返す
    • atol、_atoi64もあるよ
  • strtol
    • 数値として認識される文字列を正規表現で書くと \s*[+-]?(0[xX]?)?\d+ (8進を示す先頭0、16進を示す先頭0xが許されるのが特徴)
    • 解釈できない文字が現れた時点で停止する
    • 数値に変換できない場合は0を返す
    • 基数を2〜36で指定できる
    • 変換が終了した位置へのポインタを取得できる
    • strtoulもあるよ

整数→文字列

  • _itoa
    • 基数を2〜36で指定できる
    • _i64toa、_ui64toa、_ltoa、_ultoaもあるよ

文字列→小数

  • atof
    • 関数名と裏腹に、返値の型はdouble
    • 数値として認識される文字列を正規表現で書くと \s*[+-]?(\d+(\.\d*)?|\.\d+)([dDeE][+-]?\d+)? (間違ってるかも)
    • 解釈できない文字が現れた時点で停止する
    • 数値に変換できない場合は0.0を返す
    • リファレンスに書かれてないけど、オーバーフローした場合はHUGE_VAL、-HUGE_VALを返すっぽい
  • strtod
    • 変換方法はatofと同じ
    • オーバーフローした場合はHUGE_VAL、-HUGE_VALを返す(こっちはちゃんとリファレンスに書いてある)
    • 変換が終了した位置へのポインタを取得できる

小数→文字列

  • _ecvt
    • 有効数字の桁数を指定できる
    • 出力バッファには数字のみが格納され、符号と小数点の位置は別の引数で取得する
  • _fcvt
    • 小数部の桁数を指定できる
    • 出力バッファには数字のみが格納され、符号と小数点の位置は別の引数で取得する
  • _gcvt
    • 有効数字の桁数を指定できる
    • 基本的には小数形式で出力するが、出力するのが整数部のみの場合(指数形式で書かないと有効数字が何桁か表現できない場合)は指数形式になる
      • 例;_gcvt_s(buf, 100, 12345.6789, 3) -> 1.23e+004
    • 後続の0は取り除かれる

文字列→各種の型

各種の型→文字列