diff --git a/AK/FixedPoint.h b/AK/FixedPoint.h index 72948d1c50..d4513efa19 100644 --- a/AK/FixedPoint.h +++ b/AK/FixedPoint.h @@ -420,10 +420,14 @@ struct Formatter> : StandardFormatter { m_width = m_width.value_or(0); m_precision = m_precision.value_or(6); + bool is_negative = false; + if constexpr (IsSigned) + is_negative = value < 0; + i64 integer = value.ltrunk(); constexpr u64 one = static_cast(1) << precision; u64 fraction_raw = value.raw() & (one - 1); - return builder.put_fixed_point(integer, fraction_raw, one, base, upper_case, m_zero_pad, m_align, m_width.value(), m_precision.value(), m_fill, m_sign_mode, real_number_display_mode); + return builder.put_fixed_point(is_negative, integer, fraction_raw, one, base, upper_case, m_zero_pad, m_align, m_width.value(), m_precision.value(), m_fill, m_sign_mode, real_number_display_mode); } }; diff --git a/AK/Format.cpp b/AK/Format.cpp index 10b18c0e63..c7bf1df12c 100644 --- a/AK/Format.cpp +++ b/AK/Format.cpp @@ -357,6 +357,7 @@ ErrorOr FormatBuilder::put_i64( } ErrorOr FormatBuilder::put_fixed_point( + bool is_negative, i64 integer_value, u64 fraction_value, u64 fraction_one, @@ -373,7 +374,6 @@ ErrorOr FormatBuilder::put_fixed_point( StringBuilder string_builder; FormatBuilder format_builder { string_builder }; - bool is_negative = integer_value < 0; if (is_negative) integer_value = -integer_value; diff --git a/AK/Format.h b/AK/Format.h index 3ccec0eee7..e36d4b006f 100644 --- a/AK/Format.h +++ b/AK/Format.h @@ -209,6 +209,7 @@ public: SignMode sign_mode = SignMode::OnlyIfNeeded); ErrorOr put_fixed_point( + bool is_negative, i64 integer_value, u64 fraction_value, u64 fraction_one, diff --git a/Tests/AK/TestFixedPoint.cpp b/Tests/AK/TestFixedPoint.cpp index 9628309abf..b7fb63e09e 100644 --- a/Tests/AK/TestFixedPoint.cpp +++ b/Tests/AK/TestFixedPoint.cpp @@ -155,4 +155,7 @@ TEST_CASE(formatter) EXPECT_EQ(DeprecatedString::formatted("{}", FixedPoint<16>(0.003)), "0.00299"sv); EXPECT_EQ(DeprecatedString::formatted("{}", FixedPoint<16>(0.0004)), "0.000396"sv); EXPECT_EQ(DeprecatedString::formatted("{}", FixedPoint<16>(0.0000000005)), "0"sv); + EXPECT_EQ(DeprecatedString::formatted("{}", FixedPoint<16>(-0.1)), "-0.099991"sv); + EXPECT_EQ(DeprecatedString::formatted("{}", FixedPoint<16>(-0.02)), "-0.01999"sv); + EXPECT_EQ(DeprecatedString::formatted("{}", FixedPoint<16>(-0.0000000005)), "0"sv); }