фильтр price_format (Форматирует числа, например цены, типа аот так: 10 000 000.00)
This commit is contained in:
46
oknardia/oknardia/templatetags/filters.py
Executable file
46
oknardia/oknardia/templatetags/filters.py
Executable file
@@ -0,0 +1,46 @@
|
|||||||
|
#! coding: utf-8
|
||||||
|
__author__ = 'Sergei Erjemin'
|
||||||
|
|
||||||
|
from django import template
|
||||||
|
register = template.Library()
|
||||||
|
|
||||||
|
|
||||||
|
@register.filter()
|
||||||
|
def price_format(value: float, seperator: str = ' ') -> str:
|
||||||
|
""" Форматирует длинные числа в удобочитаемый вид (делит на тысячи, миллионы, миллиарды и т.д.).
|
||||||
|
Работает для целых чисел и чисел с плавающей точкой.
|
||||||
|
9837979.67 -> 9 837 979.67
|
||||||
|
|
||||||
|
:param value: число
|
||||||
|
:param seperator: str -- разделитель (по умолчанию - символ тонкой шпации (узкого пробела)  )
|
||||||
|
:return: str -- строка в котором число с разделителями
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
if isinstance(value, int):
|
||||||
|
# Если число целое
|
||||||
|
value = str(value)
|
||||||
|
penny = '' # половинный пробел
|
||||||
|
else:
|
||||||
|
# Если число с плавающей точкой, десятичное или строка
|
||||||
|
value = str(value)
|
||||||
|
# value = "%.2f" % value
|
||||||
|
# знаки после целой части
|
||||||
|
penny = value[value.find('.'):]
|
||||||
|
# целая часть
|
||||||
|
value = value[:value.find('.')]
|
||||||
|
|
||||||
|
# Если целая часть меньше 3-х символов -
|
||||||
|
# то ее разделять не нужно
|
||||||
|
if len(value) <= 3:
|
||||||
|
return value + penny
|
||||||
|
parts = []
|
||||||
|
# Выбираем по три символа в список
|
||||||
|
while value:
|
||||||
|
parts.append(value[-3:])
|
||||||
|
value = value[:-3]
|
||||||
|
# Сортируем список в обратном порядке
|
||||||
|
parts.reverse()
|
||||||
|
# Возвращаем результат
|
||||||
|
return seperator.join(parts) + penny
|
||||||
|
except (IndexError, ValueError):
|
||||||
|
return value
|
||||||
Reference in New Issue
Block a user