2

幅の広い文字列を double の数値に変換する必要があります。おそらく、文字列には数値だけが保持されています (おそらくいくつかの空白)。文字列にそれ以外のものが含まれている場合は、エラーが表示されます。したがって、使用できませんstringstream-文字列に他のものが含まれている場合、エラーを表示せずに数値を抽出します。

wcstod完璧なソリューションのように思えますが、Android (GCC 4.8、NDK r9) では正しく動作しません。他にどのようなオプションを試すことができますか?

4

1 に答える 1

5

を使用してからstringstream、 を使用std:wsして、ストリーム上の残りの文字が空白のみであることを確認できます。

double parseNum (const std::wstring& s)
{
    std::wistringstream iss(s);
    double parsed;
    if ( !(iss >> parsed) )
    {
        // couldn't parse a double
        return 0;
    }
    if ( !(iss >> std::ws && iss.eof()) )
    {
        // something after the double that wasn't whitespace
        return 0;
    }
    return parsed;
}

int main()
{
    std::cout << parseNum(L"  123  \n  ") << '\n';
    std::cout << parseNum(L"  123 asd \n  ") << '\n';
}

版画

$ ./a.out 
123
0

0(エラーの場合、私の例では手早く簡単なものとして返されました。おそらく、throwまたは何かをしたいでしょう)。

もちろん他のオプションもあります。に対するあなたの評価は不当だと感じましたstringstream。ところで、これは実際にチェックたい数少ないケースの 1 つですeof()

編集:わかりました、s を使用するためにws とs を追加しました。Lwchar_t

編集: これは、2 番目のif概念が拡張されたように見えるものです。なぜそれが正しいのかを理解するのに役立つかもしれません。

if ( iss >> std::ws )
{ // successfully read some (possibly none) whitespace
    if ( iss.eof() )
    { // and hit the end of the stream, so we know there was no garbage
        return parsed;
    }
    else
    { // something after the double that wasn't whitespace
        return 0;
    }
}
else
{ // something went wrong trying to read whitespace
    return 0;
}
于 2013-09-27T13:16:55.783 に答える