C++ 我如何知道我的C++;字符串变量是否为数字

C++ 我如何知道我的C++;字符串变量是否为数字,c++,string,parsing,C++,String,Parsing,我有一个字符串的类字符串 string str; 我如何检查它是否是一个数字,str只能有下面描述的3种可能的类型,如 abcd 或者类似的数字 123.4 或在其结尾附加括号的数字,例如 456) 注意,“str”结尾的括号是数字和无数字的唯一可能组合 如果最后两个被认为是有效数字,我知道如果只有前两个情况发生,我可以使用词汇转换,但是考虑所有3个可能发生的情况如何? 我不需要对str做任何花哨的事情,我只需要知道它是否是我描述的有效数字你必须定义“数字”。没有通用的“数字”类型(例如

我有一个字符串的类字符串

string str;
我如何检查它是否是一个数字,str只能有下面描述的3种可能的类型,如

abcd
或者类似的数字

123.4
或在其结尾附加括号的数字,例如

456)
注意,“str”结尾的括号是数字和无数字的唯一可能组合

如果最后两个被认为是有效数字,我知道如果只有前两个情况发生,我可以使用词汇转换,但是考虑所有3个可能发生的情况如何? 我不需要对str做任何花哨的事情,我只需要知道它是否是我描述的有效数字

你必须定义“数字”。没有通用的“数字”类型(例如,第一个数字是双精度的,而第二个是整数)

也就是说,如中所示,
lexical_cast
只是检查目的地是否存在,并且只检查目的地是否存在:

template <typename R, typename T>
R lexical_cast(const T& pX)
{
    std::stringstream ss;
    ss << pX;

    R result;               // take out any whitespace, make sure nothing is left
    if ((ss >> result).fail() || !(ss >> std::ws).eof())
    {
        throw std::bad_cast();
    }

    return result;
}
模板
R词法转换(常量T和pX)
{
std::stringstream-ss;
ss>result).fail()| |!(ss>>std::ws.eof())
{
抛出std::bad_cast();
}
返回结果;
}
因此,只需创建一个新函数:

template <typename R, typename T>
R weak_lexical_cast(const T& pX)
{
    std::stringstream ss;
    ss << pX;

    R result;
    if ((ss >> result).fail())
    {
        throw std::bad_cast();
    }

    return result;
}
模板
R弱词法转换(常量T和pX)
{
std::stringstream-ss;
ss>结果)。失败()
{
抛出std::bad_cast();
}
返回结果;
}

基本上是一个代码> ListalyOxCase<代码>,但不关心任何剩余字符(允许您的第二个数字工作)。< /P> < P>也许正则表达式会为您提供技巧。

< P>解析字符串的C++解决方案是字符串流。将字符串放入
std::istringstream
并从中读取

要解析它,您可以尝试从字符串中读取(
无符号
int

如果失败,则该字符串不是以数字开头。
如果有效,请查看下一个角色。如果这是一个
你有一个浮点数,如果它是
,你有一个整数。(否则会出现读取错误。)

类似于

void read(const std::string& str)
{
  std::istringstream iss(str);
  int i;
  if( !(iss>>i) ) {
    // str contains "abcd"
  } else {
    switch( iss.peek() ) {
      case ')': 
        // i contains '456'
        break;
      case '.' {
        double d;
        if( !(iss>>d) ) throw "dammit!";
        d += i;
        // d contains floating point value
        break;
      default: throw "what?!";
  }
  // ...
}

这有意义吗

重复:哇。在SO的一个半月里,我不能说我见过在原稿发布3小时后发布的副本。@Maulrus但你见过大象飞吗?尽管投了反对票,这也不是个坏主意。你能举个例子吗?