From e205a701c134c8c5f24bc3f1bb0559327552c8fc Mon Sep 17 00:00:00 2001 From: Vladislav Shchapov Date: Wed, 3 Jul 2024 21:39:58 +0500 Subject: [PATCH] Fix format of negative std::complex without sign option in format string Signed-off-by: Vladislav Shchapov --- include/fmt/std.h | 11 ++++++++--- test/std-test.cc | 6 ++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/include/fmt/std.h b/include/fmt/std.h index 2e6cf12f3f436..244c6e8a1cc00 100644 --- a/include/fmt/std.h +++ b/include/fmt/std.h @@ -631,8 +631,7 @@ struct formatter : formatter { #endif // __cpp_lib_atomic_flag_test FMT_EXPORT -template -struct formatter, Char> { +template struct formatter, Char> { private: int width_; detail::fill_t fill_; @@ -666,7 +665,13 @@ struct formatter, Char> { if (c.real() != 0) { auto format_full = detail::string_literal{}; - return fmt::format_to(out, basic_string_view(format_full), + auto format_full_neg = + detail::string_literal{}; + + if (c.imag() >= 0) + return fmt::format_to(out, basic_string_view(format_full), + f->nested(c.real()), f->nested(c.imag())); + return fmt::format_to(out, basic_string_view(format_full_neg), f->nested(c.real()), f->nested(c.imag())); } auto format_imag = detail::string_literal{}; diff --git a/test/std-test.cc b/test/std-test.cc index 17c95cfe57ed2..618bf477fe9de 100644 --- a/test/std-test.cc +++ b/test/std-test.cc @@ -67,9 +67,15 @@ TEST(std_test, thread_id) { TEST(std_test, complex) { EXPECT_EQ(fmt::format("{}", std::complex(1, 2.2)), "(1+2.2i)"); + EXPECT_EQ(fmt::format("{}", std::complex(1, -2.2)), "(1-2.2i)"); EXPECT_EQ(fmt::format("{}", std::complex(0, 2.2)), "2.2i"); + EXPECT_EQ(fmt::format("{}", std::complex(0, -2.2)), "-2.2i"); EXPECT_EQ(fmt::format("{:>20.2f}", std::complex(1, 2.2)), " (1.00+2.20i)"); + EXPECT_EQ(fmt::format("{:<20.2f}", std::complex(1, 2.2)), + "(1.00+2.20i) "); + EXPECT_EQ(fmt::format("{:<20.2f}", std::complex(1, -2.2)), + "(1.00-2.20i) "); } #ifdef __cpp_lib_source_location