我有一个生成的字符串,使用以下方式传递给模板工具包并输出:
https://metacpan.org/module/Template::Plugin::Number::Format
它使用format_price
如果它们为零,我想把价格降低。所以100.00变为100
无法找到任何明确的解决方案。
更新
format_price
在此项目中的数百个地方使用,如果可能的话,我不想更改它,并尽可能使用此功能覆盖该方法。
答案 0 :(得分:2)
您可以扩展Template::Plugin::Number::Format
以创建自己的插件,如下所示:
package Template::Plugin::My::Number::Format;
use base qw(Template::Plugin::Number::Format);
use Number::Format;
sub init {
my ($self, $config) = @_;
$self->SUPER::init($config);
my $nfo = Number::Format->new(%$config);
$self->{ _CONTEXT }->define_filter(format_price => sub {
my ($context, @args) = @_;
return sub {
my $text = shift;
my $result = $nfo->format_price($text, @args);
$result =~ s/\.00$//;
return $result;
};
}, 1);
return $self;
}
然后在你的模板中你可以使用你的插件:
[% USE My.Number.Format %]
...
[% some_number | format_price %]
答案 1 :(得分:1)
实现此函数的覆盖以根据需要执行操作应该相对简单。
插件代码几乎无关紧要。从安装它的任何地方获取它的副本并使其成为代码库的一部分,因此您的版本是在编译期间找到的版本,即
Myapp/lib/Template/Plugin/Number/Format.pm
编辑它:
-use Number::Format;
+use Number::Format::NoZeroCents;
然后在代码中添加一个新模块:
Myapp/lib/Number/Format/NoZeroCents.pm;
看起来像这样:
package Number::Format::NoZeroCents;
use strict;
use warnings;
use base 'Number::Format';
sub format_price {
my $self = shift;
my ($number, $precision, $symbol) = @_;
if(defined $precision){ #default behaviour
printf STDERR "%s: default behaviour for %s\n", __PACKAGE__, join(';',@_);
return $self->SUPER::format_price(@_)
}
else {
$precision = 0 if $number == int($number);
printf STDERR "%s: override behaviour for %s\n", __PACKAGE__, $number;
return $self->SUPER::format_price($number, $precision, $symbol)
}
}
1;
这应该意味着您的代码默认使用NoZeroCents方法,但是当您希望$ 100.00出现时,可以通过调用[% number | format_price(2) %]
来覆盖。
<强>更新强>
Number :: Format在被告知使用precision =&gt;时肯定是正确的。 0,这个快速测试确认:
#!/usr/bin/env perl
use strict;
use warnings;
use Number::Format qw(format_price);
my $v = 100.00;
printf "Original value as string '%s'; as number '%f'; as fp '%s'; as fp0: '%s'\n",
$v, $v, format_price($v), format_price($v,0);
产生:
Original value as string '100'; as number '100.000000'; as fp 'AUD 100.00'; as fp0: 'AUD 100'
答案 2 :(得分:0)
看起来额外的零特别适用于货币模式。
format_price($精度) 返回一个包含“$ number”的字符串,其格式与“format_number()”类似,不同之处在于小数部分可能添加了尾随零,以使其精确为“$ precision”字符长,并且货币字符串将带有前缀。
如果你还想避免它,我想只是不使用这种模式就足够了