2

我需要将宽字符串转换为双数。据推测,该字符串包含一个数字而没有其他内容(可能是一些空格)。如果字符串包含其他任何内容,则应指示错误。所以我不能使用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顺便说一句,这是您真正想要检查的少数情况之一eof()

编辑:好的,我添加了ws 和Ls 来使用wchar_ts。

编辑:这是第二个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 回答