2013-12-20 5 views
3

У меня есть значение валюты, которое я хотел бы форматировать, используя Locale::Currency::Format, однако я понятия не имею, как отформатировать его.Perl Logic in Template Toolkit

Вот мой выход в Template Toolkit

[% amount %] 

Я хотел бы, чтобы быть выведен с помощью следующего метода:

currency_format('USD', amount, FMT_SYMBOL) 

Новый шаблон для инструментария, так что любая помощь приветствуется.

+1

Я понимаю, что это можно сделать в контроллере, но я хотел бы знать, можно ли это обрабатывать в шаблоне. – KingKongFrog

+0

У вас есть [EVAL_PERL] (http://search.cpan.org/~abw/Template-Toolkit-2.25/lib/Template/Manual/Directives.pod#PERL) включен в вашем контроллере? Если это так, вы можете включить raw perl в свой шаблон. – codnodder

ответ

2

Мне нравится Dave Cross 'Ответ, и я согласен с ним и codnodder о EVAL_PERL, который я еще не нашел нужным в качестве решения в течение 7 или 8 лет почти ежедневного использования TT.

Лично я хотел бы использовать:

[%- USE fmt = Class('Locale::Currency::Format'); -%] 

<td>[% fmt.currency_format(var1, var2, var3) %]</td> 

Но если я использую это все время, я был бы соблазн написать TT плагин обертку вокруг него.

1

Если у вас есть EVAL_PERL, включенный в ваш «контроллер», вы можете использовать встроенный perl , чтобы включить модуль и добавить, например, vmethod.

Е.Г.,

use strict; 
use Template; 

my $tt = Template->new(EVAL_PERL=>1); 
my $out; 
$tt->process(\*DATA, { amount => 50.34 }, \$out) or die $tt->error, "\n"; 
print $out; 

__DATA__ 
[% PERL -%] 
sub dollars { sprintf('$%0.02f', $_[0]); } 
# or: 
# use Local::Currency::Format; 
# sub dollars { currency_format('USD', $_[0], FMT_SYMBOL); } 
$stash->define_vmethod('scalar', 'dollars', \&dollars); 
[% END -%] 
The amount is [% amount.dollars %]. 

Если у вас есть доступ к "контроллеру", вы можете добавить FILTER.

use strict; 
use Template; 
#use Local::Currency::Format; 

my $tt = Template->new({ 
    #FILTERS => { 'dollars' => sub { currency_format('USD', $_[0], FMT_SYMBOL); } }, 
    FILTERS => { 'dollars' => sub { sprintf('$%0.02f', $_[0]); } }, 
}); 
my $out; 
$tt->process(\*DATA, { amount => 50.34 }, \$out) or die $tt->error, "\n"; 
print $out; 

__DATA__ 
The amount is [% amount | dollars %]. 

EDIT: Обратите внимание, что мое использование sprintf для форматирования валюты просто заполнитель. Вы замените это на любой выбранный вами модуль или метод.

1

Я не могу найти Local :: Currency :: Format на CPAN, поэтому я не могу показать вам, как именно он работает с этим модулем. Я могу, однако, показать вам общее направление вам нужно идти в

У вас есть несколько вариантов:.

1/Использование currency_format для форматирования данных, прежде чем он передается в шаблон.

my $amount = currency_format('USD', $amount, FMT_SYMBOL); 
$tt->process($template_name, { amount => $amount, ... }) or die; 

Затем в шаблоне вы можете просто использовать [% amount %].

2/Pass currency_format как динамическая переменная к шаблону.

$tt->process($template_name, { 
    amount   => $amount, 
    currency_format = > \&currency_format, 
    ... 
}) or die; 

Затем в шаблоне, вы можете использовать currency_format как функция:

[% currency_format('USD', amount, FMT_SYMBOL) %] 

3/Написать реальный TT плагин для местного :: Валюты :: Format.

+0

У меня изначально были те же мысли, что и вы, пока я не увидел комментарий OP об обработке этого исключительно внутри шаблона. Просто доводя это до вашего сведения, если у вас были другие мысли о методах, которые работают исключительно внутри шаблона, но не нужны 'EVAL_PERL => 1' @ Dave-Cross – codnodder

+1

Мое правило состоит в том, что если вы достигнете EVAL_PERL , то вы делаете слишком много в шаблоне :-) –

+2

Не могу договориться подробнее @ Dave-Cross – codnodder

Смежные вопросы