Check if the input is a number or string in C++
Solution 1
You can use regex
to do this:
#include <regex>
bool isNumber(std::string x){
std::regex e ("^-?\\d+");
if (std::regex_match (x,e)) return true;
else return false;}
If you want to make isNumber()
a generic function which can take any type of input:
#include <regex>
#include <sstream>
template<typename T>
bool isNumber(T x){
std::string s;
std::regex e ("^-?\\d+");
std::stringstream ss;
ss << x;
ss >>s;
if (std::regex_match (s,e)) return true;
else return false;}
The above isNumber()
function checks for integer only, double or float value with precision (which contains dot .
) will not return true.
If you want precision too, then change the regex
line to:
std::regex e ("^-?\\d*\\.?\\d+");
If you want a more efficient solution, see this one.
Solution 2
If you're using C++98, you can use stringstreams
(#include <sstream>
):
std::string s = "1234798797";
std::istringstream iss(s);
int num = 0;
if (!(iss >> num).fail()) {
std::cout << num << std::endl;
}
else {
std::cerr << "There was a problem converting the string to an integer!" << std::endl;
}
If boost is available to you, you can use lexical_cast (#include <boost/lexical_cast.hpp>
):
std::string s = "1234798797";
int num = boost::lexical_cast<int>(si);//num is 1234798797
std::cout << num << std::endl;
If C++11 is available to you, you can use the builtin std::stoi
function from <string>
:
std::string s = "1234798797";
int mynum = std::stoi(s);
std::cout << mynum << std::endl;
OUTPUTS:
1234798797
Solution 3
The function isdigit() is used to test for only digits ( 0,1,...,9)
use this function to check for numbers
bool is_number(const std::string& s)
{
std::string::const_iterator it = s.begin();
while (it != s.end() && std::isdigit(*it)) ++it;
return !s.empty() && it == s.end();
}
Solution 4
The input to isdigit
is an integer value. However, it will return true (non-zero) only if the value corresponds to '0'-'9'. If you convert them to integer values, they are 48-57. For all other values, isdigit
will return false (zero).
You can check whether you got an integer by changing checking logic:
if ( cin.fail() )
{
cout<<"Correct"<<endl;
}
else
{
cout<<"Enter Numbers Only"<<endl;
}
Solution 5
Another answer using strtod
:
bool isNumber(const std::string& s){
if(s.empty() || std::isspace(s[0]) || std::isalpha(s[0])) return false ;
char * p ;
strtod(s.c_str(), &p) ;
return (*p == 0) ;
}
To be able to handle any type of parameter use template:
#include <sstream>
template<typename T>
bool isNumber(T x){
std::string s;
std::stringstream ss;
ss << x;
ss >>s;
if(s.empty() || std::isspace(s[0]) || std::isalpha(s[0])) return false ;
char * p ;
strtod(s.c_str(), &p) ;
return (*p == 0) ;
}
Note:
- White space will make it return false.
-
NAN
andINF
will make it return false (to be exact, any character except valid exponent will make it return false). If you want to allownan
andinf
, delete the|| std::isalpha(s[0])
part. - scientific form is allowed i.e 1e+12 will return true.
- Double/float or integer will return true.
- This is more efficient than the regex answer. (regex is heavy).
WESTRUK
Updated on July 12, 2022Comments
-
WESTRUK almost 2 years
I wrote the following code to check whether the input(answer3) is a number or string, if it is not a number it should return "Enter Numbers Only" but it returns the same even for numbers. Please suggest me a solution.
#include <iostream> #include <string> #include <typeinfo> #include <stdio.h> #include <stdlib.h> #include <ctype.h> using namespace std; int main () { string ques1= "Client's Name :"; string ques2 = "Client's Address :"; string ques3 = "Mobile Number :"; char answer1 [80]; string answer2; int answer3; cout<<ques1<<endl; cin>>answer1; cout<<ques2<<endl; cin>>answer2; cout<<ques3<<endl; cin>>answer3; if (isdigit(answer3)) { cout<<"Correct"<<endl; } else { cout<<"Enter Numbers Only"<<endl; } system("pause>null"); return 0; }
-
Chethan N about 10 yearsThis can't be used for decimal numbers. Only integers can be checked.
-
Ken Zein about 9 years@jrd1: no pun intended :)