Go back to Richel Bilderbeek's homepage.

Go back to Richel Bilderbeek's C++ page.

 

 

 

 

 

(C++) StrToDouble

 

StrToDouble is a code snippet to convert a std::string to double. DoubleToStr converts an double to std::string.

 

StrToDouble has multiple versions:

 

 

 

 

 

C++98STL StrToDouble using the C++98 and the STL

 

Uses std::atof.

 

#include <string>

//From http://www.richelbilderbeek.nl/CppStrToDouble.htm
const double StrToDouble(const std::string& s)
{
  return std::atof(s.c_str());
}

 

 

 

 

 

C++98Boost StrToDouble using the C++98 and the Boost library

 

Uses boost::lexical_cast.

 

#include <string>
#include <boost/lexical_cast.hpp>

const double StrToDouble(const std::string& s)
{
  return boost::lexical_cast<double>(s);
}

 

 

 

 

 

C++11STL StrToDouble using the C++11 and the STL

 

Uses std::stod.

 

#include <string>

//From http://www.richelbilderbeek.nl/CppStrToDouble.htm
double StrToDouble(const std::string& s)
{
  return std::stod(s);
}

 

 

 

 

 

StrToDouble testing code

 

 

#include <string>
//From http://www.richelbilderbeek.nl/CppStrToDouble.htm
double StrToDoubleStl(const std::string& s)
{
  return std::atof(s.c_str());
}

//From http://www.richelbilderbeek.nl/CppStrToDouble.htm
double StrToDoubleCpp0x(const std::string& s)
{
  return std::stof(s);
}

#include <boost/lexical_cast.hpp>
//From http://www.richelbilderbeek.nl/CppStrToDouble.htm
double StrToDoubleBoost(const std::string& s)
{
  return boost::lexical_cast<double>(s);
}

bool CanStrToDoubleStl(const std::string& s)
{
  const double i = std::atof(s.c_str());
  return i!=0.0 || s=="0.0";
}

double CanStrToDoubleCpp0x(const std::string& s)
{
  try { std::stof(s); }
  catch (std::exception&) { return false; }
  return true;
}

double CanStrToDoubleBoost(const std::string& s)
{
  try { boost::lexical_cast<double>(s); }
  catch (boost::bad_lexical_cast&) { return false; }
  return true;
}

#include <cassert>
///fuzzy_equal_to is a predicate to test two doubles for equality
///with a certain tolerance. A tolerance of 0.0 denotes that
///an exact match is requested. Note that the value of 0.0 cannot
///be compared fuzzily.
//From http://www.richelbilderbeek.nl/CppFuzzy_equal_to.htm
struct fuzzy_equal_to
  : public std::binary_function<double,double,bool>
{
  fuzzy_equal_to(const double tolerance = 0.01)
    : m_tolerance(tolerance)
  {
    assert(tolerance >= 0.0);
  }
  bool operator()(const double lhs, const double rhs) const
  {
    return rhs > (1.0 - m_tolerance) * lhs
        && rhs < (1.0 + m_tolerance) * lhs;
  }
  const double m_tolerance;
};

int main()
{
  assert(!CanStrToDoubleStl("a"));
  assert(!CanStrToDoubleCpp0x("a"));
  assert(!CanStrToDoubleBoost("a"));
  assert(CanStrToDoubleStl("0.0"));
  assert(CanStrToDoubleCpp0x("0.0"));
  assert(CanStrToDoubleBoost("0.0"));
  assert(CanStrToDoubleStl("123.456"));
  assert(CanStrToDoubleCpp0x("123.456"));
  assert(CanStrToDoubleBoost("123.456"));
  const std::string s = "123.456";
  assert(fuzzy_equal_to(0.00001)(StrToDoubleStl(s),StrToDoubleCpp0x(s)));
  assert(fuzzy_equal_to(0.00001)(StrToDoubleStl(s),StrToDoubleBoost(s)));
}

 

 

 

 

 

Go back to Richel Bilderbeek's C++ page.

Go back to Richel Bilderbeek's homepage.

 

Valid XHTML 1.0 Strict