2

检查像“2.4393”或“2”这样的字符串是否有效的最快方法是什么——它们都可以用双精度表示——而字符串“2.343”。还是“ab.34”不是?特别是,我希望能够读取任何字符串,如果它可以是双精度,则为其分配一个双精度变量,如果它不能是双精度(如果它是一个单词或只是无效输入) ,将显示一条错误消息。

4

4 回答 4

5

使用std::istringstream并确认使用所有数据eof()

std::istringstream in("123.34ab");
double val;
if (in >> val && in.eof())
{
    // Valid, with no trailing data.
}
else
{
    // Invalid.
}

请参阅http://ideone.com/gpPvu8上的演示。

于 2012-12-06T11:46:23.990 回答
2

您可以使用std::stod()。如果字符串无法转换,则抛出异常。

于 2012-12-06T11:55:04.353 回答
0

正如 stefan 所提到的,你可以使用std::istringstream

coords          getWinSize(const std::string& s1, const std::string& s2)
{
  coords winSize;
  std::istringstream iss1(s1);
  std::istringstream iss2(s2);

  if ((iss1 >> winSize.x).fail())
    throw blabla_exception(__FUNCTION__, __LINE__, "Invalid width value");
  /*
   .....
  */
}

在我的代码中,坐标是:

typedef struct coords {
    int     x;
    int     y;
} coords;
于 2012-12-06T11:43:48.890 回答
0

使用boost::lexical_cast,如果转换失败则抛出异常。

于 2012-12-06T11:48:27.140 回答