Twig: Как округлить?

У меня есть разделение на ветке. Иногда результат может быть с десятичными знаками, и мне нужно всегда иметь округленный результат.

Ex.

7 / 2 = 3.5

Я хотел бы иметь

7 / 2 = 4

Я знаю, как использовать пол в веточке:

7 / 2 | floor = 3

Но это округление до нижней цифры, а не к верхней.

Я также знаю, что могу использовать number_format

7 / 2 | number_format(0, '.', ',') = 3

Таким образом, это также примет нижнюю цифру.

Любая идея о том, как сказать ветку взять верхнюю цифру?

Это можно сделать в контроллере (Symfony), но я ищу версию твига.

Спасибо.

Ответ 1

Обновить

В версиях 1.15. 0+ доступен round фильтр.

{{ (7 / 2)|round(1, 'ceil') }}

http://twig.sensiolabs.org/doc/filters/round.html


Вы можете расширить веточку и написать свои пользовательские функции, как описано здесь

И это будет примерно так:

<?php
// src/Acme/DemoBundle/Twig/AcmeExtension.php
namespace Acme\DemoBundle\Twig;

class AcmeExtension extends \Twig_Extension
{
    public function getFilters()
    {
        return array(
            'ceil' => new \Twig_Filter_Method($this, 'ceil'),
        );
    }

    public function ceil($number)
    {
        return ceil($number);
    }

    public function getName()
    {
        return 'acme_extension';
    }
}

Так что вы можете использовать его в веточку:

7 / 2 | ceil

Ответ 2

Новое в версии 1.15.0: круглый фильтр был добавлен в Twig 1.15.0.

Пример: {{ 42.55|round(1, 'ceil') }}

Круглый фильтр принимает два необязательных аргумента; первая задает точность (по умолчанию 0), а второй метод округления (по умолчанию является общим)

http://twig.sensiolabs.org/doc/filters/round.html

Ответ 3

Не знаю, как это происходит в предыдущих версиях, но в Symfony 2.2.1 вам нужно использовать круглые скобки вокруг вашего расчета (при условии, что вы создали расширение):

(7 / 2)|ceil

По-видимому, 7 / 2|ceil совпадает с 7 / (2|ceil), поскольку оба они дали одинаковый (неверный) результат, и только мое решение для меня работало.

Ответ 4

Вы пробовали 7 // 2?

Эта страница может быть полезна.

Ответ 5

http://twig.sensiolabs.org/doc/filters/round.html

Начиная с Twig 1.15.0, вы можете использовать фильтр "round" и передать "ceil" в качестве второго параметра. Решение будет выглядеть так:

{{ (7 / 2)|round(0, 'ceil') }}

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

Ответ 6

Если вы используете версию 1.12.0 или новее, вы можете использовать тернарный оператор и сделать что-то вроде этого:

{{ ((7 / 2) > (7 // 2)) ? (7 // 2) + 1 : (7 // 2) }}

Это не так "элегантно", но все равно работает.

Ответ 7

Круглый фильтр принимает первый аргумент в качестве точности. Таким образом, правильная формулировка для ответа на вопрос ОП будет такой:

{{ (7 / 2)|round(0, 'ceil') }}

скорее, чем

{{ (7 / 2)|round(1, 'ceil') }}

http://twig.sensiolabs.org/doc/filters/round.html