From a9d2f32e40cba8b1393eb32243af319e952fed2c Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Sat, 11 Jan 2025 19:08:34 -0600 Subject: [PATCH] fix: add `render_percent()` method for app handler --- src/wuttjamaican/app.py | 16 ++++++++++++++++ tests/test_app.py | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/wuttjamaican/app.py b/src/wuttjamaican/app.py index ca9d56a..f284f40 100644 --- a/src/wuttjamaican/app.py +++ b/src/wuttjamaican/app.py @@ -772,6 +772,22 @@ class AppHandler: """ return simple_error(error) + def render_percent(self, value, decimals=2): + """ + Return a human-friendly display string for the given + percentage value, e.g. ``23.45139`` becomes ``"23.45 %"``. + + :param value: The value to be rendered. + + :returns: Display string for the percentage value. + """ + if value is None: + return "" + fmt = f'{{:0.{decimals}f}} %' + if value < 0: + return f'({fmt.format(-value)})' + return fmt.format(value) + def render_quantity(self, value, empty_zero=False): """ Return a human-friendly display string for the given quantity diff --git a/tests/test_app.py b/tests/test_app.py index 5230134..0176cfb 100644 --- a/tests/test_app.py +++ b/tests/test_app.py @@ -491,6 +491,22 @@ app_title = WuttaTest result = self.app.render_error(error) self.assertEqual(result, "RuntimeError") + def test_render_percent(self): + + # null + self.assertEqual(self.app.render_percent(None), "") + + # typical + self.assertEqual(self.app.render_percent(12.3419), '12.34 %') + + # more decimal places + self.assertEqual(self.app.render_percent(12.3419, decimals=3), '12.342 %') + self.assertEqual(self.app.render_percent(12.3419, decimals=4), '12.3419 %') + + # negative + self.assertEqual(self.app.render_percent(-12.3419), '(12.34 %)') + self.assertEqual(self.app.render_percent(-12.3419, decimals=3), '(12.342 %)') + def test_render_quantity(self): # null