I have been up all night searching for a way to determine if my string value is a valid double and I haven't found a way that will also not reject a number with a point in it...
In my searches I found this
How to determine if a string is a number with C++?
and the answer that Charles Salvia gave was
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();
}
this works for any number that doesn't have a point in it but a number with a point gets rejected...
You can use strtod
:
#include <cstdlib>
bool is_number(const std::string& s)
{
char* end = nullptr;
double val = strtod(s.c_str(), &end);
return end != s.c_str() && *end == '\0' && val != HUGE_VAL;
}
You may be tempted to use std::stod
like this:
bool is_number(const std::string& s)
{
try
{
std::stod(s);
}
catch(...)
{
return false;
}
return true;
}
but this can be quite inefficient, see e.g. zero-cost exceptions.
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