6

数値(整数だけでなく、浮動小数点型または倍精度型でも)になる文字列があり、数値以外の単語にすることもできます。

この文字列が double に変換できるかどうかを確認したいのですが、そうであれば変換を行いたいと思います。数値以外の文字列の場合は、別の動作が必要です。

私はこれを試しました:

double tmp;
string str;
stringstream ss;

ss << str;
ss >> tmp;

if (ss.fail())
{
    // non-numeric string
}
else
{
    // string to double conversion is successful
}

このコードの問題は、正しい値が含まれている場合でも、ss.fail()常にであるということです。truetmp

文字列を double に変換する関数がありますが、入力文字列が数値以外の場合に値atof()を返すため、これは私には適していません。0.0このようにして、非数値とゼロの入力値を区別することはできません。

4

6 に答える 6

7

入力文字列の型が std::string の場合、この関数を使用できます (Windows および UNIX システムで動作します)。

#include <stdlib.h>
#include <string>
/**
* @brief checkIsDouble - check inputString is double and if true return double result
* @param inputString - string for checking
* @param result - return double value
* @return true if string is double, false if not
*/
bool checkIsDouble(string inputString, double &result) {
    char* end;
    result = strtod(inputString.c_str(), &end);
    if (end == inputString.c_str() || *end != '\0') return false;
    return true;
}
于 2016-10-02T02:14:13.940 に答える
7

std::stod はどうですか? 変換を実行できない場合、std::out_of_range がスローされます。

try
{
    double value = std::stod(input_string);
    std::cout << "Converted string to a value of " << value << std::endl;
}
catch(std::exception& e)
{
    std::cout << "Could not convert string to double" << std::endl;
}

私はそれをコンパイルしようとはしませんでしたが、アイデアを得る必要があります。

于 2013-10-13T19:23:01.087 に答える
0

空白とストリームの終わりもチェック

if ((ss >> tmp) && (ss >> std::ws).eof() )
{
   // a double

}

値を抽出してdoubleから空白を抽出します。この間に eof が発生した場合は、有効なdoubleのみがあることを意味します

于 2013-10-13T19:14:37.233 に答える
0

有効な数値とは何ですか? atof() が解析するものですか、それとも空白に関する規則はありますか? 指数表記、先頭の - 、先頭の + を使用できますか? 数字の後に他のデータが続くことがありますか?小数点が必要ですか、それとも整数を受け入れますか? 先頭の小数点はそのまま使用できますか、それとも先頭に 0 を付ける必要がありますか? 00.1 を受け入れますか? 0.1FRED は受け入れますが、0.1.2FRED は拒否しますか?

関数 strtod() は、この問題のために設計されています。atof() は、不正な入力を処理するのに十分な堅牢性がないため、基本的に廃止されました。ただし、strtod() は、整形式の入力に対する特定の規則を受け入れるほど柔軟ではありません。ルールが単純な場合、独自のアドホック マッチャーを作成するのはそれほど難しくありません。空白をスキップし、数字を一致させ、小数点を一致させ、数字を一致させ、空白をスキップします。完全な柔軟性が必要な場合は、最終的に正規表現に頼る必要がありますが、これは一種の大ハンマーの答えです。

于 2016-10-02T03:23:05.110 に答える