Fix bug #9193: Spacing modification not exact

The conversion from floating point to string performed by
boost:lexical_cast does not allow specifying a precision and,
for example, values such as 0.9 are resturned as 0.899999976.
The standard C++ way for performing the conversion is using
std::ostringstream which is exempt from this problem, even if
less efficient. For the sake of accuracy, boost::lexical_cast
is ditched in favor of the ostrinsgstream implementation.
In C++11 another option would be using std::to_string, but I
think it is not as efficient as the boost way and not worth
implementing through #ifdef's.
Incidentally, this patch would have also fixed #9190 and all
similar cases involving the use of convert<string>(float|double).
This commit is contained in:
Enrico Forestieri 2014-07-12 19:12:08 +02:00
parent b3735501c7
commit 5bd14af887

View File

@ -17,6 +17,7 @@
#include <boost/lexical_cast.hpp> #include <boost/lexical_cast.hpp>
#include <string> #include <string>
#include <sstream>
//needed for Mac OSX 10.5.2 Leopard //needed for Mac OSX 10.5.2 Leopard
#include <cstdlib> #include <cstdlib>
@ -106,14 +107,18 @@ docstring convert<docstring>(long l)
template<> template<>
string convert<string>(float f) string convert<string>(float f)
{ {
return lexical_cast<string>(f); std::ostringstream val;
val << f;
return val.str();
} }
template<> template<>
string convert<string>(double d) string convert<string>(double d)
{ {
return lexical_cast<string>(d); std::ostringstream val;
val << d;
return val.str();
} }