When I use getline
, I would input a bunch of strings or numbers, but I only want the while loop to output the "word" if it is not a number. So is there any way to check if "word" is a number or not? I know I could use atoi()
for C-strings but how about for strings of the string class?
int main () { stringstream ss (stringstream::in | stringstream::out); string word; string str; getline(cin,str); ss<<str; while(ss>>word) { //if( ) cout<<word<<endl; } }
We can use the isdigit() function to check if the string is an integer or not in Python. The isdigit() method returns True if all characters in a string are digits. Otherwise, it returns False.
Use the Number() Function to Check Whether a Given String Is a Number or Not in JavaScript. The Number() function converts the argument to a number representing the object's value. If it fails to convert the value to a number, it returns NaN.
Another version...
Use strtol
, wrapping it inside a simple function to hide its complexity :
inline bool isInteger(const std::string & s) { if(s.empty() || ((!isdigit(s[0])) && (s[0] != '-') && (s[0] != '+'))) return false; char * p; strtol(s.c_str(), &p, 10); return (*p == 0); }
strtol
?As far as I love C++, sometimes the C API is the best answer as far as I am concerned:
strtol
seems quite raw at first glance, so an explanation will make the code simpler to read :
strtol
will parse the string, stopping at the first character that cannot be considered part of an integer. If you provide p
(as I did above), it sets p
right at this first non-integer character.
My reasoning is that if p
is not set to the end of the string (the 0 character), then there is a non-integer character in the string s
, meaning s
is not a correct integer.
The first tests are there to eliminate corner cases (leading spaces, empty string, etc.).
This function should be, of course, customized to your needs (are leading spaces an error? etc.).
See the description of strtol
at: http://en.cppreference.com/w/cpp/string/byte/strtol.
See, too, the description of strtol
's sister functions (strtod
, strtoul
, etc.).
The accepted answer will give a false positive if the input is a number plus text, because "stol" will convert the firsts digits and ignore the rest.
I like the following version the most, since it's a nice one-liner that doesn't need to define a function and you can just copy and paste wherever you need it.
#include <string> ... std::string s; bool has_only_digits = (s.find_first_not_of( "0123456789" ) == std::string::npos);
EDIT: if you like this implementation but you do want to use it as a function, then this should do:
bool has_only_digits(const string s){ return s.find_first_not_of( "0123456789" ) == string::npos; }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With