Не работает фильтр format в phalconphp

phalconphp formatПонадобилось вывести целую часть дробного числа в представлении. Из встроенных фильтров Volt подходящий:
«format Форматирует строку, используя sprintf»

{{price|format('%d')}}

«Фиг вам» — ответил phalcon и вывел цену вместе с дробной частью.
UPD: Пришел ответ на issue, оказывается фильтр format следует использовать отличным от других фильтров способом, разработчики не парились особо с шаблонизатором и слизали его с TWIG

{{'%d'|format(price)}}


Первыми делом смотрим, что там в сгенерированном volt.php шаблоне

echo sprintf($price, '%d');

Ага, понятно, вот и корень проблемы, при программировании встроенных фильтров не подумали о порядке подстановки аргументов в вызываемую функцию.
В фильтрах trim, strip_tags и других — сначала идет переменная, над которой производятся манипуляции, а потом только аргументы. А format — исключение из правил.
Запиливаем «issue» разработчикам.
Когда баг будет исправлен — пока не очень понятно, поэтому надо найти решение возникшей проблемы:
Необходимость такого поведения этого фильтра кажется мне очень сомнительной. Такой подход позволяет использовать несколько переменных для подставления в одну строку, но нафига это надо — непонятно. Куда проще и понятнее вывести значение переменной в том месте в шаблоне, где это нужно, запихивать внутри шаблона кусок текста в код — затея дурацкая изначально.
Возможно, конечно, так сделали для возможности интернационализации, но я такой способ считаю неприемлемым.
И вообще функцию sprintf мне приходилось использовать только для вывода сообщений в консоль, на живых сайтах мне она не пригождалась.
Поэтому добавим-ка мы лучше фильтр number_format, которого очень не хватает и фильтры ceil, floor и round. И про format можно забыть.
В number_format сразу жестко зашьем разделитель десятичных разрядов — точку и разделитель тысяч — неразрывный пробел.

$di->setShared('view', function() use($config) {
    $view = new \Phalcon\Mvc\View();
    $view->registerEngines(array(
        ".volt" => function($view, $di) use($config) {
            $volt = new \Phalcon\Mvc\View\Engine\Volt($view, $di);
            $volt->getCompiler()->addFilter(
                'nf', 
                function($resolvedArgs, $exprArgs) {
                    $var = $exprArgs ?  $exprArgs[0]['expr']['value'] : $resolvedArgs;
                    $dec = isset($exprArgs[1]['expr']['value']) ? $exprArgs[1]['expr']['value'] : 0;
                    $ds = isset($exprArgs[2]['expr']['value']) ? $exprArgs[2]['expr']['value'] : '.';
                    $ts = isset($exprArgs[3]['expr']['value']) ? $exprArgs[3]['expr']['value'] : ' ';
                    return 'str_replace(" ", "'.$ts.'", '.
                        'number_format('.$var.', '.$dec.', "'.$ds.'", " "))';
                }
            );
            $volt->getCompiler()->addFilter('ceil', 'ceil');
            $volt->getCompiler()->addFilter('floor', 'floor');
            $volt->getCompiler()->setOptions(array(
                "compiledPath" => $config->application->documentRoot.'/app/volt/',
            ));
            return $volt;
        }
    ));
    return $view;
});

На общей производительности сайта добавленные нами фильтры не скажутся никак совершенно. Работают он лишь при генерации php отображения для volt шаблонов, а это происходить будет на работающем сайте буквально несколько раз за все время его жизни.