1

Есть ли фильтр шаблонов django для получения только цифр после с плавающей запятой?Формат Django float получает только цифры после с плавающей запятой

Например:

2.34 --> 34 
2.00 --> 00 
1.10 --> 10 

Я не нашел ответа в https://docs.djangoproject.com/en/dev/ref/templates/builtins/.

+2

Вы всегда можете написать свой собственный ... – rnevius

ответ

3

Помимо creating your own custom filter, вы можете решить эту проблему с помощью django-mathfilters package:

{{ value|mod:1|mul:100|floatformat:"0" }} 

где:

  • mod является фильтром "по модулю" обеспечивается mathfilters
  • mul является "умножение" фильтр предоставлено mathfilters
  • floatformat встроенный в Джанго фильтр

Демо:

>>> from django.template import Template, Context 
>>> c = Context({'value': 2.34}) 
>>> t = Template('{% load mathfilters %}{{ value|mod:1|mul:100|floatformat:"0" }}') 
>>> t.render(c) 
u'34' 
+0

Спасибо! Однако есть ли какой-либо трюк, чтобы получить начальный ноль? С текущим фильтром: 2.04 -> 4. Я хотел бы 2.04 -> 04. Я попытался добавить | stringformat: «02d» без успеха. – poiuytrez

0

Поскольку существует слишком много других вопросов, упомянутых этим, я хотел бы добавить еще один ответ тоже.

Что касается меня, то ответ, предложенный @alecxe, является излишним. Читаемость отстой, и ваш проект начинает зависеть от дополнительной библиотеки. Но вам нужно всего лишь показать две цифры на странице.

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

@register.filter 
def floatfract(value): 
    sf = "%.2f" % value 
    return sf.split('.')[1] 

и использовать его в шаблонах:

{{ object.price|floatfract }} 

Вот так. Я использую его.

Чтобы сделать ответ полностью, я могу расширить его с помощью случая, когда вы хотели бы иметь гибкую длину фракции. Например, от 2 до 5 цифр. выглядит намного хуже:

@register.filter 
def floatfract(value, length=2): 
    sf = "%.{length}f".format(length=length) % value 
    return sf.split('.')[1] 

Использование:

{{ object.price|floatfract:5 }}