そこで、atof を使用して文字列を double に変換します。ただし、入力が間違っているかどうかを知る必要があります (y564 など)。どうすれば確認できますか?それをさらに操作するには、正しい番号が必要です。
double x = atof(s.c_str());
std::stodを使用することもできます:
bool parse_double(std::string in, double& res) {
try {
size_t read= 0;
res = std::stod(in, &read);
if (in.size() != read)
return false;
} catch (std::invalid_argument) {
return false;
}
return true;
}
int main()
{
double d;
bool b = parse_double("123z", d);
if (b)
std::cout << d;
else
std::cout << "Wrong input";
}
[編集]
ここで見つけることができます:
戻り値
成功時の str の内容に対応する double 値。変換後の値が戻り値の型の範囲外の場合、戻り値は未定義です。変換を実行できない場合は、0.0 が返されます。
そのため、入力が間違っているか、含まれているかを判断できません0
。
を使用しstd::stod
ます。無効な入力に対して例外をスローします。または、C ソリューションに固執する場合は、strtod
;を使用します。結果に関する詳細情報が得られます。
atof の定義 ( http://en.cppreference.com/w/cpp/string/byte/atof ):
戻り値
成功時の str の内容に対応する double 値。変換後の値が戻り値の型の範囲外の場合、戻り値は未定義です。変換を実行できない場合は、0.0 が返されます。
最新の C++ を使用していて、今すぐ返す必要がある場合は、より適切に使用してくださいstd::strtod
( http://en.cppreference.com/w/cpp/string/byte/strtof ):
double strtod( const char* str, char** str_end );
その戻り値は次のように定義されます。
戻り値
成功時の str の内容に対応する浮動小数点値。変換された値が対応する戻り値の型の範囲外の場合、範囲エラーが発生し、HUGE_VAL、HUGE_VALF、または HUGE_VALL が返されます。変換を実行できない場合は、0 が返され、*str_end が str に設定されます。
救助への正規表現(すなわちlibpcre):
// checked_atof.cpp
#include <iostream>
#include <cstdlib>
#include <pcrecpp.h>
const char FP_RE[] = "^[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?";
using namespace std;
int main()
{
std:string s;
double number;
pcrecpp::RE fpre(FP_RE);
cout << "Enter a floating point number: " << endl;
cin >> s;
if (!fpre.FullMatch(s)) {
cout << "Sorry, not a valid floating point number!" << endl;
} else {
number = atof(s.c_str());
cout << "Ok, result: " << number << endl;
}
return 0;
}
インストール/コンパイルの詳細については、libpcre
ドキュメントを参照してください。次のものがシステムで機能する場合があります。
g++ checked_atof.cpp $(pkg-config --cflags libpcrecpp) $(pkg-config --libs libpcrecpp) -o checked_atof
$ ./checked_atof.exe
Enter a floating point number:
23.42
Ok, result: 23.42
$ ./checked_atof.exe
Enter a floating point number:
3.14159e-4
Ok, result: 0.000314159
$ ./checked_atof.exe
Enter a floating point number:
x9
Sorry, not a valid floating point number!
文字列の各文字が「。」であるかどうかを簡単に確認できます。またはstd::isdigit(int ch) atof に渡す前に (「.」は一意である必要があります)
よりコンパクトな解決策は、^[0-9]+(\.[0-9]+)?$
一般的な浮動値に対して機能するような正規表現を使用した文字列です。