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

时间:2010-05-16 21:24:10

标签: c++ string parsing

我有一个类字符串

的字符串
string str;

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

abcd

或类似

的数字
123.4

或带有括号的数字附加到结尾,例如

456)

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

其中底部两个被认为是有效数字,我知道如果只出现前两种情况我可以使用lexical_cast,但如何考虑所有3种可能的情况呢? 我不需要用str做任何事情,我只需要知道它是否是我描述的有效数字

3 个答案:

答案 0 :(得分:0)

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

也就是说,如this answer所示,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;
}

所以只需创建一个新功能:

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;
}

它基本上是lexical_cast但不关心任何剩余的字符(允许你的第二个数字起作用。)

答案 1 :(得分:0)

也许一个正则表达式可以帮到你。

答案 2 :(得分:0)

用于手动解析字符串的C ++解决方案是字符串流。将您的字符串放入std::istringstream并从中读取。

您可以做的解析是尝试从字符串中读取(unsignedint
如果失败,则为不以数字开头的字符串 如果它有效,请查看下一个字符。如果那是.你有一个浮点数,如果它是),你就有一个整数。 (否则您有读数错误。)

的内容
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?!";
  }
  // ...
}

这有意义吗?