Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do i verify a string is valid double (even if it has a point in it)?

Tags:

c++

string

double

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...

like image 488
Michael David Woolweaver Avatar asked Mar 20 '15 14:03

Michael David Woolweaver


1 Answers

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.

like image 72
emlai Avatar answered Sep 21 '22 16:09

emlai