diff --git a/include/etl/private/to_string_helper.h b/include/etl/private/to_string_helper.h index 7a9d9df2..255053d5 100644 --- a/include/etl/private/to_string_helper.h +++ b/include/etl/private/to_string_helper.h @@ -136,13 +136,12 @@ namespace etl void add_integral(T value, TIString& str, const etl::basic_format_spec& format, - bool append) + bool append, + const bool negative) { typedef typename TIString::value_type type; typedef typename TIString::iterator iterator; - const bool negative = etl::is_negative(value); - if (!append) { str.clear(); @@ -152,6 +151,12 @@ namespace etl if (value == 0) { + // If number is negative, append '-' (a negative zero might occure for fractional numbers > -1.0) + if ((format.get_base() == 10U) && negative) + { + str.push_back(type('-')); + } + str.push_back(type('0')); } else @@ -239,16 +244,17 @@ namespace etl const workspace_t fractional, TIString& str, const etl::basic_format_spec& integral_format, - const etl::basic_format_spec& fractional_format) + const etl::basic_format_spec& fractional_format, + const bool negative) { typedef typename TIString::value_type type; - etl::private_to_string::add_integral(integral, str, integral_format, true); + etl::private_to_string::add_integral(integral, str, integral_format, true, negative); if (fractional_format.get_precision() > 0) { str.push_back(type('.')); - etl::private_to_string::add_integral(fractional, str, fractional_format, true); + etl::private_to_string::add_integral(fractional, str, fractional_format, true, false); } } @@ -307,7 +313,7 @@ namespace etl fractional = 0; } - etl::private_to_string::add_integral_fractional(integral, fractional, str, integral_format, fractional_format); + etl::private_to_string::add_integral_fractional(integral, fractional, str, integral_format, fractional_format, etl::is_negative(value)); } etl::private_to_string::add_alignment(str, start, format); @@ -324,7 +330,7 @@ namespace etl { uintptr_t p = reinterpret_cast(value); - return etl::private_to_string::add_integral(p, str, format, append); + return etl::private_to_string::add_integral(p, str, format, append, false); } //*************************************************************************** @@ -441,7 +447,7 @@ namespace etl { etl::basic_format_spec format; - etl::private_to_string::add_integral(int32_t(value), str, format, append); + etl::private_to_string::add_integral(int32_t(value), str, format, append, etl::is_negative(value)); return str; } @@ -455,7 +461,7 @@ namespace etl !etl::is_same::value>::value, const TIString& > ::type to_string(const T value, TIString& str, const etl::basic_format_spec& format, bool append = false) { - etl::private_to_string::add_integral(int32_t(value), str, format, append); + etl::private_to_string::add_integral(int32_t(value), str, format, append, etl::is_negative(value)); return str; } @@ -471,7 +477,7 @@ namespace etl { etl::basic_format_spec format; - etl::private_to_string::add_integral(uint32_t(value), str, format, append); + etl::private_to_string::add_integral(uint32_t(value), str, format, append, false); return str; } @@ -485,7 +491,7 @@ namespace etl !etl::is_same::value>::value, const TIString& > ::type to_string(const T value, TIString& str, const etl::basic_format_spec& format, bool append = false) { - etl::private_to_string::add_integral(uint32_t(value), str, format, append); + etl::private_to_string::add_integral(uint32_t(value), str, format, append, false); return str; } @@ -502,7 +508,7 @@ namespace etl { etl::basic_format_spec format; - etl::private_to_string::add_integral(int32_t(value), str, format, append); + etl::private_to_string::add_integral(int32_t(value), str, format, append, etl::is_negative(value)); return str; } @@ -517,7 +523,7 @@ namespace etl !etl::is_same::value, const TIString&>::type to_string(const T value, TIString& str, const etl::basic_format_spec& format, bool append = false) { - etl::private_to_string::add_integral(int32_t(value), str, format, append); + etl::private_to_string::add_integral(int32_t(value), str, format, append, etl::is_negative(value)); return str; } @@ -534,7 +540,7 @@ namespace etl { etl::basic_format_spec format; - etl::private_to_string::add_integral(uint32_t(value), str, format, append); + etl::private_to_string::add_integral(uint32_t(value), str, format, append, false); return str; } @@ -549,7 +555,7 @@ namespace etl !etl::is_same::value, const TIString&>::type to_string(const T value, TIString& str, const etl::basic_format_spec& format, bool append = false) { - etl::private_to_string::add_integral(uint32_t(value), str, format, append); + etl::private_to_string::add_integral(uint32_t(value), str, format, append, false); return str; } @@ -566,7 +572,7 @@ namespace etl { etl::basic_format_spec format; - etl::private_to_string::add_integral(int64_t(value), str, format, append); + etl::private_to_string::add_integral(int64_t(value), str, format, append, etl::is_negative(value)); return str; } @@ -581,7 +587,7 @@ namespace etl etl::is_same::value, const TIString&>::type to_string(const T value, TIString& str, const etl::basic_format_spec& format, bool append = false) { - etl::private_to_string::add_integral(int64_t(value), str, format, append); + etl::private_to_string::add_integral(int64_t(value), str, format, append, etl::is_negative(value)); return str; } @@ -598,7 +604,7 @@ namespace etl { etl::basic_format_spec format; - etl::private_to_string::add_integral(uint64_t(value), str, format, append); + etl::private_to_string::add_integral(uint64_t(value), str, format, append, false); return str; } @@ -613,7 +619,7 @@ namespace etl etl::is_same::value, const TIString&>::type to_string(const T value, TIString& str, const etl::basic_format_spec& format, bool append = false) { - etl::private_to_string::add_integral(uint64_t(value), str, format, append); + etl::private_to_string::add_integral(uint64_t(value), str, format, append, false); return str; } diff --git a/test/test_to_string.cpp b/test/test_to_string.cpp index 02d6c227..76e1c52d 100644 --- a/test/test_to_string.cpp +++ b/test/test_to_string.cpp @@ -266,6 +266,9 @@ namespace CHECK(etl::string<20>(STR(" -12.345678")) == etl::to_string(-12.345678, str, Format().precision(6).width(11).right())); CHECK(etl::string<20>(STR("-12.345678 ")) == etl::to_string(-12.345678, str, Format().precision(6).width(11).left())); + + CHECK(etl::string<20>(STR(" -0.123456")) == etl::to_string(-0.123456, str, Format().precision(6).width(10).right())); + CHECK(etl::string<20>(STR("-0.123456 ")) == etl::to_string(-0.123456, str, Format().precision(6).width(10).left())); } //*************************************************************************