Форматирование чисел с разделителями в Django и Python
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для форматирования чисел в шаблонах Django используйте фильтр floatformat
, призванный управлять точностью десятичных чисел: {{ number|floatformat:2 }}
вернёт число с двуми знаками после запятой. Для добавления разделителей тысяч активируйте django.contrib.humanize
, включив его в INSTALLED_APPS
, и привлеките к помощи фильтр intcomma
: {{ number|intcomma }}
. Учёт локализации и особенностей форматирования валют потребуют создания собственных фильтров на основе модуля locale
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()
.
Форматированные поля в модели
Следование единым правилам — залог успеха. Добавьте отформатированное поле в модель для последовательного представления чисел везде, а не только в шаблонах.
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
вы сможете полностью контролировать форматирование валют:
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
позволяет контролировать точность, обеспечивая при этом читаемость за счёт корректно расставленных запятых.
Визуализация
Преобразование чисел можно уподобить настройке электронных часов:
До форматирования (исходное время): 151500
После форматирования (настроенное время): 15:15:00
Форматирование в Django может быть столь же простым, как использование {{ value|number_format }}
для преобразования "сырых" чисел в отформатированный вид:
| Необработанный ввод | Django шаблон | Отформатированный вывод|
| -------------------------- | -----------------| ----------------------- |
| 123456.78 | {{ value|number_format }} | 123,456.78 |
Достижение необходимой точности и ясности осуществимо так же легко, как настройка времени на часах.
Особенности и устранение проблем
Будьте готовы к потенциальным проблемам связанным с округлением и настройками локализации при форматировании чисел. Обязательно потестируйте различные сценарии, особенно с числами с плавающей запятой.
Важно помнить:
- Юмор и кодинг — залог эффективной отладки!
Большие высоты: масштабируемые и производительные решения
В крупных проектах решения относительно форматирования должны быть масштабируемыми и производительными, обеспечивая высокую эффективность работы даже при обработке данных из различных источников.
Полезные материалы
- Язык шаблонов Django | Документация Django | Django
- Встроенные теги шаблонов и фильтры | Документация Django | Django
- Пользовательские теги шаблонов и фильтры | Документация Django | Django
- Приложение “местные особенности” — документация django-localflavor 4.0
- Перевод | Документация Django | Django
- string — Общие операции со строками — Документация Python 3.12.2
- F-строки Python для интерполяции и форматирования строк – Real Python