diff --git a/libtransmission/utils.cc b/libtransmission/utils.cc index a6211072e..37c7cbd84 100644 --- a/libtransmission/utils.cc +++ b/libtransmission/utils.cc @@ -755,25 +755,76 @@ std::string tr_formatter_speed_KBps(double kilo_per_second) auto speed = kilo_per_second; - if (speed <= 999.95) // 0.0 KB to 999.9 KB + if (speed < 999.95) // 0.0 KB to 999.9 KB (0.0 KiB to 999.9 KiB) { - return fmt::format("{:Ld} {:s}", int(speed), std::data(speed_units[TR_FMT_KB].name)); + return fmt::format("{:.1Lf} {:s}", speed, std::data(speed_units[TR_FMT_KB].name)); } double const kilo = speed_units[TR_FMT_KB].value; speed /= kilo; - if (speed <= 99.995) // 0.98 MB to 99.99 MB + if (speed < 99.995) // 0.98 MB to 99.99 MB (1.00 MiB to 99.99 MiB) { return fmt::format("{:.2Lf} {:s}", speed, std::data(speed_units[TR_FMT_MB].name)); } - - if (speed <= 999.95) // 100.0 MB to 999.9 MB + if (speed < 999.95) // 100.0 MB to 999.9 MB (100.0 MiB to 999.9 MiB) { return fmt::format("{:.1Lf} {:s}", speed, std::data(speed_units[TR_FMT_MB].name)); } - return fmt::format("{:.1Lf} {:s}", speed / kilo, std::data(speed_units[TR_FMT_GB].name)); + speed /= kilo; + + if (speed < 99.995) // 0.98 GB to 99.99 GB (1.00 GiB to 99.99 GiB) + { + return fmt::format("{:.2Lf} {:s}", speed, std::data(speed_units[TR_FMT_GB].name)); + } + // 100.0 GB and above (100.0 GiB and above) + return fmt::format("{:.1Lf} {:s}", speed, std::data(speed_units[TR_FMT_GB].name)); +} + +std::string tr_formatter_speed_compact_KBps(double kilo_per_second) +{ + using namespace formatter_impl; + + auto speed = kilo_per_second; + + if (speed < 99.95) // 0.0 KB to 99.9 KB (0.0 KiB to 99.9 KiB) + { + return fmt::format("{:.1Lf} {:s}", speed, std::data(speed_units[TR_FMT_KB].name)); + } + if (speed < 999.5) // 100 KB to 999 KB (100 KiB to 999 KiB) + { + return fmt::format("{:.0Lf} {:s}", speed, std::data(speed_units[TR_FMT_KB].name)); + } + + double const kilo = speed_units[TR_FMT_KB].value; + speed /= kilo; + + if (speed < 9.995) // 0.98 MB to 9.99 MB (1.00 MiB to 9.99 MiB) + { + return fmt::format("{:.2Lf} {:s}", speed, std::data(speed_units[TR_FMT_MB].name)); + } + if (speed < 99.95) // 10.0 MB to 99.9 MB (10.0 MiB to 99.9 MiB) + { + return fmt::format("{:.1Lf} {:s}", speed, std::data(speed_units[TR_FMT_MB].name)); + } + if (speed < 999.5) // 100 MB to 999 MB (100 MiB to 999 MiB) + { + return fmt::format("{:.0Lf} {:s}", speed, std::data(speed_units[TR_FMT_MB].name)); + } + + speed /= kilo; + + if (speed < 9.995) // 0.98 GB to 9.99 GB (1.00 GiB to 9.99 GiB) + { + return fmt::format("{:.2Lf} {:s}", speed, std::data(speed_units[TR_FMT_GB].name)); + } + if (speed < 99.95) // 10.0 GB to 99.9 GB (10.0 GiB to 99.9 GiB) + { + return fmt::format("{:.1Lf} {:s}", speed, std::data(speed_units[TR_FMT_GB].name)); + } + // 100 GB and above (100 GiB and above) + return fmt::format("{:.0Lf} {:s}", speed, std::data(speed_units[TR_FMT_GB].name)); } size_t tr_mem_K = 0; diff --git a/libtransmission/utils.h b/libtransmission/utils.h index f49d98ef0..24c3e9dc0 100644 --- a/libtransmission/utils.h +++ b/libtransmission/utils.h @@ -311,19 +311,21 @@ extern size_t tr_speed_K; extern size_t tr_mem_K; extern uint64_t tr_size_K; /* unused? */ -/* format a speed from KBps into a user-readable string. */ +/** @brief Format a speed from KBps into a user-readable string of at most 4 significant digits. */ [[nodiscard]] std::string tr_formatter_speed_KBps(double kilo_per_second); +/** @brief Format a speed from KBps into a user-readable string of at most 3 significant digits. */ +[[nodiscard]] std::string tr_formatter_speed_compact_KBps(double kilo_per_second); -/* format a memory size from bytes into a user-readable string. */ +/** @brief Format a memory size from bytes into a user-readable string. */ [[nodiscard]] std::string tr_formatter_mem_B(size_t bytes); -/* format a memory size from MB into a user-readable string. */ +/** @brief Format a memory size from MB into a user-readable string. */ [[nodiscard]] static inline std::string tr_formatter_mem_MB(double MBps) { return tr_formatter_mem_B((size_t)(MBps * tr_mem_K * tr_mem_K)); } -/* format a file size from bytes into a user-readable string. */ +/** @brief Format a file size from bytes into a user-readable string. */ [[nodiscard]] std::string tr_formatter_size_B(uint64_t bytes); void tr_formatter_get_units(void* dict);