From f30c33526250c495a3aa7d4b3ed1e0ec62c4da89 Mon Sep 17 00:00:00 2001 From: machines-6657 <294783368+machines-6657@users.noreply.github.com> Date: Sat, 3 Oct 2026 17:09:13 +0800 Subject: [PATCH] Fix format_length rounding at unit boundary --- humanfriendly/__init__.py | 6 +++++- humanfriendly/tests.py | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/humanfriendly/__init__.py b/humanfriendly/__init__.py index 4c0a333..faea0e3 100644 --- a/humanfriendly/__init__.py +++ b/humanfriendly/__init__.py @@ -284,9 +284,13 @@ def format_length(num_metres, keep_width=False): >>> format_length(0.004) '4 mm' """ - for unit in reversed(length_size_units): + units = list(reversed(length_size_units)) + for index, unit in enumerate(units): if num_metres >= unit['divider']: number = round_number(float(num_metres) / unit['divider'], keep_width=keep_width) + if index and float(number) >= units[index - 1]['divider'] / unit['divider']: + unit = units[index - 1] + number = round_number(float(num_metres) / unit['divider'], keep_width=keep_width) return pluralize(number, unit['singular'], unit['plural']) return pluralize(num_metres, 'metre') diff --git a/humanfriendly/tests.py b/humanfriendly/tests.py index 72dad99..e61d09f 100644 --- a/humanfriendly/tests.py +++ b/humanfriendly/tests.py @@ -544,6 +544,7 @@ def test_format_length(self): self.assertEqual('1 metre', format_length(1)) self.assertEqual('42 metres', format_length(42)) self.assertEqual('1 km', format_length(1 * 1000)) + self.assertEqual('1 km', format_length(999.999)) self.assertEqual('15.3 cm', format_length(0.153)) self.assertEqual('1 cm', format_length(1e-02)) self.assertEqual('1 mm', format_length(1e-03))