From a99ba75feda6dfb7f64838a311d5c30c2835d172 Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 8 Feb 2024 15:01:47 +1100 Subject: [PATCH] Report helper (#6454) * Adds helper function for formatting numbers in reports * Update docs --- InvenTree/report/templatetags/report.py | 46 +++++++++++++++++++++++++ docs/docs/report/helpers.md | 14 ++++++++ 2 files changed, 60 insertions(+) diff --git a/InvenTree/report/templatetags/report.py b/InvenTree/report/templatetags/report.py index ffb774b3a4..e66cc326a9 100644 --- a/InvenTree/report/templatetags/report.py +++ b/InvenTree/report/templatetags/report.py @@ -3,6 +3,7 @@ import base64 import logging import os +from decimal import Decimal from django import template from django.conf import settings @@ -376,3 +377,48 @@ def render_html_text(text: str, **kwargs): output += ''.join([f'' for tag in tags]) return mark_safe(output) + + +@register.simple_tag +def format_number(number, **kwargs): + """Render a number with optional formatting options. + + kwargs: + decimal_places: Number of decimal places to render + integer: Boolean, whether to render the number as an integer + leading: Number of leading zeros + """ + try: + number = Decimal(str(number)) + except Exception: + # If the number cannot be converted to a Decimal, just return the original value + return str(number) + + if kwargs.get('integer', False): + # Convert to integer + number = Decimal(int(number)) + + # Normalize the number (remove trailing zeroes) + number = number.normalize() + + decimals = kwargs.get('decimal_places', None) + + if decimals is not None: + try: + decimals = int(decimals) + number = round(number, decimals) + except ValueError: + pass + + value = str(number) + + leading = kwargs.get('leading', None) + + if leading is not None: + try: + leading = int(leading) + value = '0' * leading + value + except ValueError: + pass + + return value diff --git a/docs/docs/report/helpers.md b/docs/docs/report/helpers.md index 88be1e6a59..6aa5475e23 100644 --- a/docs/docs/report/helpers.md +++ b/docs/docs/report/helpers.md @@ -64,6 +64,20 @@ To return an element corresponding to a certain key in a container which support {% endraw %} ``` +## Formatting Numbers + +The helper function `format_number` allows for some common number formatting options. It takes a number (or a number-like string) as an input, as well as some formatting arguments. It returns a *string* containing the formatted number: + +```html +{% raw %} +{% load report %} +{% format_number 3.14159265359 decimal_places=5, leading=3 %} + +{% format_number 3.14159265359 integer=True %} + +{% endraw %} +``` + ## Rendering Currency The helper function `render_currency` allows for simple rendering of currency data. This function can also convert the specified amount of currency into a different target currency: