From ce706dd5bf53db38e8b7615f62908608ffc58e13 Mon Sep 17 00:00:00 2001 From: nawaaaaaAaar <198336470+nawaaaaaAaar@users.noreply.github.com> Date: Thu, 22 Oct 2026 12:10:31 +0000 Subject: [PATCH] Respect preformatted strings in compound-unit formatting --- babel/units.py | 7 ++++++- tests/test_units.py | 14 +++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/babel/units.py b/babel/units.py index 0f32014aa..a6198b8e3 100644 --- a/babel/units.py +++ b/babel/units.py @@ -311,7 +311,12 @@ def format_compound_unit( # Look for a specific compound unit first... - if numerator_unit and denominator_unit and denominator_value == 1: + if ( + not isinstance(numerator_value, str) + and numerator_unit + and denominator_unit + and denominator_value == 1 + ): compound_unit = _find_compound_unit(numerator_unit, denominator_unit, locale=locale) if compound_unit: return format_unit( diff --git a/tests/test_units.py b/tests/test_units.py index dcb938775..8e1ccd784 100644 --- a/tests/test_units.py +++ b/tests/test_units.py @@ -1,6 +1,18 @@ import pytest -from babel.units import format_unit, get_unit_name +from babel.units import format_compound_unit, format_unit, get_unit_name + + +@pytest.mark.parametrize('locale', ['en', 'fi', 'fr']) +@pytest.mark.parametrize('length', ['long', 'short', 'narrow']) +@pytest.mark.parametrize('value', ['custom label', '1 kg']) +def test_compound_unit_preformatted_numerator_ignores_unit(locale, length, value): + expected = format_compound_unit( + value, denominator_unit='hour', length=length, locale=locale, + ) + assert format_compound_unit( + value, 'kilometer', denominator_unit='hour', length=length, locale=locale, + ) == expected # New units in CLDR 46