How to check std::string if its indeed an integer?

前端 未结 3 1625
夕颜
夕颜 2020-12-07 02:41

The following code converts an std::string to int and the problem lies with the fact that it cannot discern from a true integer or just a random st

相关标签:
3条回答
  • 2020-12-07 03:15
    /* isdigit example */
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    int main ()
    {
      char str[]="1776ad";
      int year;
      if (isdigit(str[0]))
      {
        year = atoi (str);
        printf ("The year that followed %d was %d.\n",year,year+1);
      }
      return 0;
    }
    
    0 讨论(0)
  • 2020-12-07 03:24

    WhozCraig's approach is much nicer and I wanted to expand on it using the approach that the C++ FAQ uses which is as follows:

    #include <iostream>
    #include <sstream>
    #include <string>
    #include <stdexcept>
    
    class BadConversion : public std::runtime_error {
    public:
      BadConversion(std::string const& s)
        : std::runtime_error(s)
        { }
    };
    
    
    
    inline int convertToInt(std::string const& s,
                                  bool failIfLeftoverChars = true)
    {
      std::istringstream i(s);
      int x;
      char c;
      if (!(i >> x) || (failIfLeftoverChars && i.get(c)))
        throw BadConversion("convertToInt(\"" + s + "\")");
      return x;
    }
    
    
    int main()
    {
        std::cout << convertToInt( "100" ) << std::endl ;
        std::cout << convertToInt( "-100" ) << std::endl ;
        std::cout << convertToInt( "  -100" ) << std::endl ;
        std::cout << convertToInt( "  -100  ", false ) << std::endl ;
    
        // The next two will fail
        std::cout << convertToInt( "  -100  ", true ) << std::endl ;
        std::cout << convertToInt( "H" ) << std::endl ;
    }
    

    This is robust and will know if the conversion fails, you also can optionally choose to fail on left over characters.

    0 讨论(0)
  • 2020-12-07 03:25

    You may try to use Boost lexical_cast, it will throw an exception if the cast failed.

    int number;
    try
    {
         number = boost::lexical_cast<int>(str);
    }
    catch(boost::bad_lexical_cast& e)
    {
        std::cout << str << "isn't an integer number" << std::endl;
    }
    

    EDIT Accorinding to @chris, You may also try to use std::stoi since C++11. It will throw std::invalid_argument exception if no conversion could be performed. You may find more information here: std::stoi

    0 讨论(0)
提交回复
热议问题