diff --git a/include/fmt/format.h b/include/fmt/format.h index 7e73c172..ba3f1a78 100644 --- a/include/fmt/format.h +++ b/include/fmt/format.h @@ -1584,22 +1584,21 @@ FMT_CONSTEXPR OutputIt write(OutputIt out, const Char* s, template OutputIt write_nonfinite(OutputIt out, bool isinf, - const basic_format_specs& specs, + basic_format_specs specs, const float_specs& fspecs) { auto str = isinf ? (fspecs.upper ? "INF" : "inf") : (fspecs.upper ? "NAN" : "nan"); constexpr size_t str_size = 3; auto sign = fspecs.sign; auto size = str_size + (sign ? 1 : 0); - auto copy_it = [=](reserve_iterator it) { - if (sign) *it++ = static_cast(data::signs[sign]); - return copy_str(str, str + str_size, it); - }; - // no '0'-padding applied for non-finite values + // replace '0'-padding with space for non-finite values const bool is_zero_fill = specs.fill.size() == 1 && *specs.fill.data() == static_cast('0'); - return is_zero_fill ? base_iterator(out, copy_it(reserve(out, size))) - : write_padded(out, specs, size, copy_it); + if (is_zero_fill) specs.fill[0] = static_cast(' '); + return write_padded(out, specs, size, [=](reserve_iterator it) { + if (sign) *it++ = static_cast(data::signs[sign]); + return copy_str(str, str + str_size, it); + }); } // A decimal floating-point number significand * pow(10, exp). diff --git a/test/format-test.cc b/test/format-test.cc index cf0ca4d1..0d0a3f8e 100644 --- a/test/format-test.cc +++ b/test/format-test.cc @@ -1272,10 +1272,15 @@ TEST(format_test, format_nan) { double nan = std::numeric_limits::quiet_NaN(); EXPECT_EQ("nan", fmt::format("{}", nan)); EXPECT_EQ("+nan", fmt::format("{:+}", nan)); - EXPECT_EQ("+nan", fmt::format("{:+06}", nan)); + EXPECT_EQ(" +nan", fmt::format("{:+06}", nan)); + // '0'-fill option sets alignment to numeric overwriting any user-provided + // alignment + EXPECT_EQ(" +nan", fmt::format("{:^+06}", nan)); + EXPECT_EQ(" +nan", fmt::format("{:<+06}", nan)); + EXPECT_EQ(" +nan", fmt::format("{:>+06}", nan)); if (std::signbit(-nan)) { EXPECT_EQ("-nan", fmt::format("{}", -nan)); - EXPECT_EQ("-nan", fmt::format("{:+06}", -nan)); + EXPECT_EQ(" -nan", fmt::format("{:+06}", -nan)); } else fmt::print("Warning: compiler doesn't handle negative NaN correctly"); EXPECT_EQ(" nan", fmt::format("{: }", nan)); @@ -1290,8 +1295,13 @@ TEST(format_test, format_infinity) { EXPECT_EQ("inf", fmt::format("{}", inf)); EXPECT_EQ("+inf", fmt::format("{:+}", inf)); EXPECT_EQ("-inf", fmt::format("{}", -inf)); - EXPECT_EQ("+inf", fmt::format("{:+06}", inf)); - EXPECT_EQ("-inf", fmt::format("{:+06}", -inf)); + EXPECT_EQ(" +inf", fmt::format("{:+06}", inf)); + EXPECT_EQ(" -inf", fmt::format("{:+06}", -inf)); + // '0'-fill option sets alignment to numeric overwriting any user-provided + // alignment + EXPECT_EQ(" +inf", fmt::format("{:^+06}", inf)); + EXPECT_EQ(" +inf", fmt::format("{:<+06}", inf)); + EXPECT_EQ(" +inf", fmt::format("{:>+06}", inf)); EXPECT_EQ(" inf", fmt::format("{: }", inf)); EXPECT_EQ("INF", fmt::format("{:F}", inf)); EXPECT_EQ("inf ", fmt::format("{:<7}", inf));