From 449697e505d35b103e5db874747eca65d37c2526 Mon Sep 17 00:00:00 2001 From: Toon Verstraelen Date: Sun, 12 May 2024 17:20:14 +0200 Subject: [PATCH] Fix siunitx format of integer powers with non_int_type=decimal.Decimal (#1977) --- .gitignore | 2 ++ CHANGES | 1 + pint/delegates/formatter/latex.py | 4 ++-- pint/testsuite/test_issues.py | 17 +++++++++++++++++ 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index ae702bac3..69fd3338d 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,8 @@ MANIFEST .mypy_cache pip-wheel-metadata pint/testsuite/dask-worker-space +venv +.envrc # WebDAV file system cache files .DAV/ diff --git a/CHANGES b/CHANGES index 048765ec0..c27473af5 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,7 @@ Pint Changelog - Add `dim_sort` function to _formatter_helpers. - Add `dim_order` and `default_sort_func` properties to FullFormatter. (PR #1926, fixes Issue #1841) +- Fix LaTeX siuntix formatting when using non_int_type=decimal.Decimal. 0.23 (2023-12-08) diff --git a/pint/delegates/formatter/latex.py b/pint/delegates/formatter/latex.py index 476997b84..468a65fa4 100644 --- a/pint/delegates/formatter/latex.py +++ b/pint/delegates/formatter/latex.py @@ -124,8 +124,8 @@ def siunitx_format_unit( ) -> str: """Returns LaTeX code for the unit that can be put into an siunitx command.""" - def _tothe(power: int | float) -> str: - if isinstance(power, int) or (isinstance(power, float) and power.is_integer()): + def _tothe(power) -> str: + if power == int(power): if power == 1: return "" elif power == 2: diff --git a/pint/testsuite/test_issues.py b/pint/testsuite/test_issues.py index dc63ececd..06ca4c322 100644 --- a/pint/testsuite/test_issues.py +++ b/pint/testsuite/test_issues.py @@ -1201,3 +1201,20 @@ def test_issues_1841_xfail(): # this prints "2*pi hour * radian", not "2*pi radian * hour" unless sort_dims is True # print(q) + + +@pytest.mark.parametrize( + "given,expected", + [ + ( + "8.989e9 newton * meter^2 / coulomb^2", + r"\SI[]{8.989E+9}{\meter\squared\newton\per\coulomb\squared}", + ), + ("5 * meter / second", r"\SI[]{5}{\meter\per\second}"), + ("2.2 * meter^4", r"\SI[]{2.2}{\meter\tothe{4}}"), + ("2.2 * meter^-4", r"\SI[]{2.2}{\per\meter\tothe{4}}"), + ], +) +def test_issue1772(given, expected): + ureg = UnitRegistry(non_int_type=decimal.Decimal) + assert f"{ureg(given):Lx}" == expected