How to check if a string is a number?
Forget about ASCII code checks, use isdigit
or isnumber
(see man isnumber
). The first function checks whether the character is 0–9, the second one also accepts various other number characters depending on the current locale.
There may even be better functions to do the check – the important lesson is that this is a bit more complex than it looks, because the precise definition of a “number string” depends on the particular locale and the string encoding.
Identify if a string is a number
int n;
bool isNumeric = int.TryParse("123", out n);
Update As of C# 7:
var isNumeric = int.TryParse("123", out int n);
or if you don't need the number you can discard the out parameter
var isNumeric = int.TryParse("123", out _);
The var s can be replaced by their respective types!
In C#, how to check whether a string contains an integer?
The answer seems to be just no.
Although there are many good other answers, they either just hide the uglyness (which I did not ask for) or introduce new problems (edge cases).
Determine if a C string is a valid int in C
Have a look at strtol(), it can tell you about invalid parts of the string by pointer return.
And beware of enthusiastic example code.. see the man page for comprehensive error-handling.
How to determine if a string is a number with C++?
The most efficient way would be just to iterate over the string until you find a non-digit character. If there are any non-digit characters, you can consider the string not a number.
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();
}
Or if you want to do it the C++11 way:
bool is_number(const std::string& s)
{
return !s.empty() && std::find_if(s.begin(),
s.end(), [](unsigned char c) { return !std::isdigit(c); }) == s.end();
}
As pointed out in the comments below, this only works for positive integers. If you need to detect negative integers or fractions, you should go with a more robust library-based solution. Although, adding support for negative integers is pretty trivial.
Checking if a string contains an int
int.ParseInt
will pass only when name
is an int
, and has no other characters.
You can check if a string contains a number anywhere in it with LINQ using Any
:
if (name.Any(Char.IsDigit)) {
...
}
How do I check if a C++ string is an int?
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);
}
Why strtol
?
As far as I love C++, sometimes the C API is the best answer as far as I am concerned:
- using exceptions is overkill for a test that is authorized to fail
- the temporary stream object creation by the lexical cast is overkill and over-inefficient when the C standard library has a little known dedicated function that does the job.
How does it work ?
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.).
Sources :
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.).
Related Topics
/Usr/Lib/Libstdc++.So.6: Version 'Glibcxx_3.4.15' Not Found
Representing 128-Bit Numbers in C++
Why Does C++ Output Negative Numbers When Using Modulo
Can the Template Parameters of a Constructor Be Explicitly Specified
Why Do Std::Shared_Ptr≪Void≫ Work
Requesting Administrator Privileges At Run Time
How to Remove/Refactor a «Friend» Dependency Declaration Properly
Convert an Int to Ascii Character
Ternary Operator : VS If...Else
Creating All Possible K Combinations of N Items in C++
What Does Opencv'S Cvwaitkey( ) Function Do
Where to Put Default Parameter Value in C++
Why Is the Destructor of a Future Returned from 'Std::Async' Blocking
Metaprograming: Failure of Function Definition Defines a Separate Function
Default Value of Function Parameter
Embed Text File in a Resource in a Native Windows Application
Why Is My Integer Math With Std::Pow Giving the Wrong Answer