Форматирование чисел с разделителями в Django и Python

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для форматирования чисел в шаблонах Django используйте фильтр floatformat, призванный управлять точностью десятичных чисел: {{ number|floatformat:2 }} вернёт число с двуми знаками после запятой. Для добавления разделителей тысяч активируйте django.contrib.humanize, включив его в INSTALLED_APPS, и привлеките к помощи фильтр intcomma: {{ number|intcomma }}. Учёт локализации и особенностей форматирования валют потребуют создания собственных фильтров на основе модуля locale Python.

Примеры:

Python
Скопировать код
{{ number|floatformat:2 }}  # 123.46 – принципиально важная точность!
{{ big_number|intcomma }}   # 1,234,567 – мы просто обожаем большие числа!

Установка глобальной нормы форматирования

В крупномасштабных проектах стандартизация играет важную роль. Стоит установить USE_THOUSAND_SEPARATOR = True в файле settings.py для того, чтобы разделители тысяч автоматически применялись ко всем числам в шаблонах в соответствии с LANGUAGE_CODE.

При разработке международных приложений полезно будет рассмотреть возможность использования Babel для локализованного форматирования с помощью функции babel.numbers.format_number().

Форматированные поля в модели

Следование единым правилам — залог успеха. Добавьте отформатированное поле в модель для последовательного представления чисел везде, а не только в шаблонах.

Python
Скопировать код
from django.db import models
from django.contrib.humanize.templatetags.humanize import intcomma

class MyModel(models.Model):
    number = models.DecimalField(max_digits=10, decimal_places=2)
    formatted_number = models.CharField(max_length=20, blank=True)

    def save(self, *args, **kwargs):
        self.formatted_number = intcomma(self.number)
        super().save(*args, **kwargs)  # Даже герои позволяют себе немного скромности!

Теперь форматированные числа доступны по адресу {{ my_model.formatted_number }}, это снимает необходимость использования фильтров в шаблонах.

Анимация с помощью пользовательских тегов шаблона

Если возможностей humanize не достаточно, то разумно создать свои собственные теги. Например, в my_filters.py вы сможете полностью контролировать форматирование валют:

Python
Скопировать код
from django import template
import locale

register = template.Library()

@register.filter(name='currency')
def currency(value):
    locale.setlocale(locale.LC_ALL, '')
    return locale.currency(value, grouping=True)

После {% load my_filters %} можно применить {{ price|currency }}, чтобы форматировать числа, как валютные единицы с учётом локализации.

Балансируйте между точностью и читаемостью

Фильтр floatformat позволяет контролировать точность, обеспечивая при этом читаемость за счёт корректно расставленных запятых.

Визуализация

Преобразование чисел можно уподобить настройке электронных часов:

Markdown
Скопировать код
До форматирования (исходное время): 151500
После форматирования (настроенное время): 15:15:00

Форматирование в Django может быть столь же простым, как использование {{ value|number_format }} для преобразования "сырых" чисел в отформатированный вид:

Markdown
Скопировать код
|        Необработанный ввод | Django шаблон    | Отформатированный вывод|
| -------------------------- | -----------------| ----------------------- |
|             123456.78      | {{ value|number_format }} | 123,456.78           |

Достижение необходимой точности и ясности осуществимо так же легко, как настройка времени на часах.

Особенности и устранение проблем

Будьте готовы к потенциальным проблемам связанным с округлением и настройками локализации при форматировании чисел. Обязательно потестируйте различные сценарии, особенно с числами с плавающей запятой.

Важно помнить:

  • Юмор и кодинг — залог эффективной отладки!

Большие высоты: масштабируемые и производительные решения

В крупных проектах решения относительно форматирования должны быть масштабируемыми и производительными, обеспечивая высокую эффективность работы даже при обработке данных из различных источников.

Полезные материалы

  1. Язык шаблонов Django | Документация Django | Django
  2. Встроенные теги шаблонов и фильтры | Документация Django | Django
  3. Пользовательские теги шаблонов и фильтры | Документация Django | Django
  4. Приложение “местные особенности” — документация django-localflavor 4.0
  5. Перевод | Документация Django | Django
  6. string — Общие операции со строками — Документация Python 3.12.2
  7. F-строки Python для интерполяции и форматирования строк – Real Python