C++で数値のフォーマット方法まとめ
C++で数値→文字列や文字列→数値の変換をするとき、様々な方法があってよく分からなくなることがあるので、知っている範囲でまとめてみました。
Javaだったらだいたい「DecimalFormat使っとけ」で一発なんだけどなあ。
注意点
- 基本的に文字列をcharで扱う関数を取り上げていますが、たいがいの関数にはwchar_tバージョンもあります(関数名のどっかにwが入っている)
- ロケールを指定できるバージョンがある関数も多いです(関数名末尾に_lが付いてる)
- セキュリティが強化されたバージョン(関数名末尾に_sとかが付いてる)があるやつはそっちを使いましょう
- リンク先はMSDNのリファレンスです
文字列→整数
整数→文字列
- _itoa
- 基数を2〜36で指定できる
- _i64toa、_ui64toa、_ltoa、_ultoaもあるよ
文字列→小数
- atof
- 関数名と裏腹に、返値の型はdouble
- 数値として認識される文字列を正規表現で書くと
\s*[+-]?(\d+(\.\d*)?|\.\d+)([dDeE][+-]?\d+)?
(間違ってるかも) - 解釈できない文字が現れた時点で停止する
- 数値に変換できない場合は0.0を返す
- リファレンスに書かれてないけど、オーバーフローした場合はHUGE_VAL、-HUGE_VALを返すっぽい
- HUGE_VALはmath.hに定義がある
- strtod
- 変換方法はatofと同じ
- オーバーフローした場合はHUGE_VAL、-HUGE_VALを返す(こっちはちゃんとリファレンスに書いてある)
- 変換が終了した位置へのポインタを取得できる
小数→文字列
文字列→各種の型
- sscanf
- 書式はいろいろなオプションがあるので、printf書式指定フィールドのリファレンスを参照
- istringstream
- basic_istream::operator>> を使うことで、文字列から様々な型の値を読み出せる
- 書式指定はiomanipを使うと色々できるんだっけ
- このあたりの仕組みは正直まだよく分かってない><
各種の型→文字列
- sprintf
- _snprintf
- この2つの違いは、後者は出力の最大文字数が(バッファサイズとは別に)指定できること
- 書式はprintf書式指定フィールドのリファレンスを参照
- ostringstream
- basic_ostream::operator<< を使うことで、様々な型の値を文字列に格納できる