2013-12-20 76 views
3

我有一個貨幣值,我想用Locale::Currency::Format來格式化,但是我不知道如何格式化它。模板工具包中的Perl邏輯

這裏是我的模板工具包輸出

[% 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)?如果是這樣,你可以在你的模板中包含原始的perl。 – codnodder

回答

2

我喜歡戴夫克羅斯的答案,我同意他和codnodder約EVAL_PERL,我還沒有找到作爲幾乎每天TT使用7年或8年的解決方案所必需的。

就個人而言,我會用:

[%- 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 %]. 

編輯:請注意,我使用sprintf來格式化貨幣只是一個佔位符。你可以用你選擇的模塊或方法替換它。

1

我無法在CPAN上找到Local :: Currency :: Format,因此我無法向您顯示它是如何與此模塊配合使用的。我可以,不過,告訴你需要去的大方向

您有幾種選擇:

1 /使用currency_format之前它被傳遞到模板的數據格式。

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

然後在模板你可以只使用[% amount %]

2 /通過currency_format作爲模板的動態變量。

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

然後在模板中,你可以使用currency_format作爲一個函數:

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

3 /寫一個真正的TT插件當地::貨幣::格式。

+0

我原本和你有同樣的想法,直到我看到OP關於在模板中完全處理它的評論。如果您對模板中專有的方法有任何其他想法,但不需要'EVAL_PERL => 1' @ Dave-Cross – codnodder

+1

我的經驗法則是,如果您想要獲得EVAL_PERL ,那麼你在模板中做得太多了:-) –

+2

非常同意@ Dave-Cross – codnodder