#include "double-conversion/double-conversion.h"
|
|
|
|
#define BEGIN_C extern "C" {
|
|
#define END_C }
|
|
|
|
|
|
namespace dc = double_conversion;
|
|
|
|
|
|
BEGIN_C
|
|
|
|
int
|
|
double_to_shortest(unsigned char* buf, size_t size, size_t* len, double val)
|
|
{
|
|
int flags = dc::DoubleToStringConverter::UNIQUE_ZERO |
|
|
dc::DoubleToStringConverter::EMIT_POSITIVE_EXPONENT_SIGN |
|
|
dc::DoubleToStringConverter::EMIT_TRAILING_DECIMAL_POINT |
|
|
dc::DoubleToStringConverter::EMIT_TRAILING_ZERO_AFTER_POINT;
|
|
|
|
dc::StringBuilder builder(reinterpret_cast<char*>(buf), size);
|
|
dc::DoubleToStringConverter conv(flags, NULL, NULL, 'e', -6, 21, 6, 0);
|
|
|
|
if(!conv.ToShortest(val, &builder)) {
|
|
return 0;
|
|
}
|
|
|
|
*len = (size_t) builder.position();
|
|
builder.Finalize();
|
|
|
|
return 1;
|
|
}
|
|
|
|
END_C
|