From b7997a5e885258c2ab5e5137f01da2e6984d9e3e Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Sat, 16 Aug 2025 11:33:58 +0200 Subject: [PATCH] Use a simpler way of formatting floats --- apps/openmw/mwgui/tooltips.cpp | 56 +++++----------------------- apps/openmw_tests/mwgui/tooltips.cpp | 2 +- 2 files changed, 10 insertions(+), 48 deletions(-) diff --git a/apps/openmw/mwgui/tooltips.cpp b/apps/openmw/mwgui/tooltips.cpp index 788123c625..678847532c 100644 --- a/apps/openmw/mwgui/tooltips.cpp +++ b/apps/openmw/mwgui/tooltips.cpp @@ -30,50 +30,6 @@ #include "itemmodel.hpp" -namespace -{ - template - struct LimitedFloat - { - float mValue; - - constexpr unsigned short getPrecision() { return Precision; } - }; -} - -template <> -struct std::formatter, char> -{ - template - constexpr ParseContext::iterator parse(ParseContext& ctx) - { - return ctx.begin(); - } - - template - FmtContext::iterator format(LimitedFloat<> v, FmtContext& ctx) const - { - constexpr unsigned short precision = v.getPrecision(); - // FLOAT_MAX needs 39 digits + 1 for the sign + 1 for the decimal separator - constexpr std::size_t bufferSize = 41 + precision; - char buffer[bufferSize]; - std::to_chars_result result - = std::to_chars(buffer, buffer + bufferSize, v.mValue, std::chars_format::fixed, precision); - if (result.ec != std::errc()) - { - // Should never happen, but just default to regular float formatting - return std::format_to(ctx.out(), "{}", v.mValue); - } - // Trim result so 1.00 turns into 1 - char* end = result.ptr; - while (end > buffer && *(end - 1) == '0') - --end; - if (end > buffer && *(end - 1) == '.') - --end; - return std::ranges::copy(buffer, end, ctx.out()).out; - } -}; - namespace MWGui { ToolTips::ToolTips() @@ -687,7 +643,13 @@ namespace MWGui std::string ToolTips::toString(const float value) { - return std::format("{}", LimitedFloat(value)); + std::string s = std::format("{:.2f}", value); + // Trim result so 1.00 turns into 1 + while (!s.empty() && s.back() == '0') + s.pop_back(); + if (!s.empty() && s.back() == '.') + s.pop_back(); + return s; } std::string ToolTips::toString(const int value) @@ -699,14 +661,14 @@ namespace MWGui { if (weight == 0) return {}; - return std::format("\n{}: {}", prefix, LimitedFloat(weight)); + return std::format("\n{}: {}", prefix, toString(weight)); } std::string ToolTips::getPercentString(const float value, std::string_view prefix) { if (value == 0) return {}; - return std::format("\n{}: {}%", prefix, LimitedFloat(value * 100)); + return std::format("\n{}: {}%", prefix, toString(value * 100)); } std::string ToolTips::getValueString(const int value, std::string_view prefix) diff --git a/apps/openmw_tests/mwgui/tooltips.cpp b/apps/openmw_tests/mwgui/tooltips.cpp index 61784dbfbd..ee41b23721 100644 --- a/apps/openmw_tests/mwgui/tooltips.cpp +++ b/apps/openmw_tests/mwgui/tooltips.cpp @@ -16,7 +16,7 @@ namespace MWGui EXPECT_EQ(ToolTips::toString(1234567.12f), "1234567.12"); EXPECT_EQ(ToolTips::toString(0.001f), "0"); EXPECT_EQ(ToolTips::toString(0.01f), "0.01"); - EXPECT_EQ(ToolTips::toString(0.01f), "0.01"); + EXPECT_EQ(ToolTips::toString(0.012f), "0.01"); EXPECT_EQ(ToolTips::toString(std::numeric_limits::infinity()), "inf"); EXPECT_EQ(ToolTips::toString(std::numeric_limits::quiet_NaN()), "nan"); }