「$:」「213.23453」のようなさまざまな文字を含む文字列があります。double 値 213.23453 を抽出して変数に格納するにはどうすればよいですか。これは C++/C であり、ラムダを使用できません。
3 に答える
次のように、関数の「貧乏人の正規表現」を使用sscanf
して、最初の桁の前の文字をスキップし、次に double を読み取ることができます。
char *str = "\"$: \" \"213.23453\"";
double d;
sscanf(str, "%*[^0-9]%lf", &d);
最初のパーセンテージ形式の後のアスタリスクに注意してください。これはsscanf
、内容を出力バッファーに書き込まずに文字列を読み取るように指示します。
これはideoneのデモです。
純粋な C++ の解決策は、数字の前のゴミ文字 ( で識別される最初の数字std::isdigit
) を手動で切り取り、一時istringstream
オブジェクトを作成してから取得することdouble
です。
std::string myStr("$:. :$$#&*$ :213.23453$:#$;");
// find the first digit:
int startPos = 0;
for (; startPos < myStr.size(); ++startPos)
if (std::isdigit(myStr[startPos])) break;
// cut off the trash:
myStr = myStr.substr(startPos, myStr.size() - startPos);
// retrieve the value:
double d;
std::istringstream(myStr) >> d;
ただし、適切な形式が指定された C スタイルsscanf
でここでも十分です :)
正規表現を使用します。
[$]?[0-9]*(\.)?[0-9]?[0-9]?
これは、$ 記号のあるものとないものに一致する必要があります。
Boost.Regexは非常に優れた正規表現ライブラリです
個人的には、Boost.Xpressiveの方が使いやすいと思います。これはヘッダーのみのライブラリであり、静的正規表現 (コンパイル時にコンパイルされる正規表現) などの優れた機能がいくつかあります。
C++11 準拠のコンパイラを使用している場合は、他の何かを使用する正当な理由がない限り、 std::regexを使用してください。