namespace std {
double strtod(const char* nptr, char** endptr);
}
概要
文字列nptrをdouble型の浮動小数点数に変換する。
endptrが非nullptrの場合、変換が終了した位置の文字へのポインタがそこに格納される- 先頭の空白は読み飛ばされ、その後の文字列が以下のいずれかの形式として解釈される
- 10進数の浮動小数点数(
1.5、-3.25e10など) 0x/0Xで始まる16進浮動小数点数(0x1.8p3など)INF・INFINITY(大文字小文字を問わない)NAN・NAN(文字列)(大文字小文字を問わない)
- 10進数の浮動小数点数(
戻り値
- 変換可能ならば変換後の数値を返す
- 変換後の数値の絶対値が大きすぎて表現できない場合、
HUGE_VAL(符号に応じて正または負)を返し、errnoにERANGEを設定する - 変換後の数値の絶対値が小さすぎて表現できない場合、大きさが
doubleの最小の正規化数以下の値(0を含む)を返す。この場合にerrnoへERANGEが設定されるかどうかは処理系定義である - 変換不可能ならば
0を返す
備考
- 小数点を表す文字は、現在のCロケールに依存する。ロケールに依存しない変換には、
std::from_chars()(C++17)を使用する - 変換できたかどうかは、戻り値ではなく
endptrがnptrから進んだかどうかで判定する - 例外を送出する
std::stod()も使用できる
例
#include <iostream>
#include <cstdlib>
int main()
{
char* end = nullptr;
double a = std::strtod("3.14abc", &end);
std::cout << static_cast<double>(a) << std::endl;
// 変換が終了した位置以降の文字列
std::cout << end << std::endl;
// 16進浮動小数点数、無限大も解釈できる
std::cout << static_cast<double>(std::strtod("0x1.8p3", nullptr)) << std::endl;
std::cout << static_cast<double>(std::strtod("INFINITY", nullptr)) << std::endl;
}
出力
3.14
abc
12
inf