模板工具包中的Perl逻辑

时间:2013-12-20 00:30:44

标签: perl template-toolkit

我有一个货币值,我想使用Locale::Currency::Format格式化,但我不知道如何格式化。

这是我在Template Toolkit中的输出

[% amount %]

我希望使用以下方法输出:

currency_format('USD', amount, FMT_SYMBOL)

模板工具包的新功能,敬请任何帮助。

3 个答案:

答案 0 :(得分:2)

我喜欢Dave Cross的答案,我同意他和codnodder关于EVAL_PERL的问题,我几乎每天都会在7年或8年内使用这个解决方案。

就个人而言,我会使用:

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

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

但如果我一直在使用它,我很想在它周围写一个TT插件包装。

答案 1 :(得分: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格式化货币只是一个占位符。您可以使用您选择的任何模块或方法替换它。

答案 2 :(得分: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 /为Local :: Currency :: Format写一个真正的TT插件。