如果00,Perl如何丢弃小数点

时间:2013-02-05 01:17:01

标签: perl cpan template-toolkit

我有一个生成的字符串,使用以下方式传递给模板工具包并输出:

https://metacpan.org/module/Template::Plugin::Number::Format

它使用format_price如果它们为零,我想把价格降低。所以100.00变为100

无法找到任何明确的解决方案。

更新

format_price在此项目中的数百个地方使用,如果可能的话,我不想更改它,并尽可能使用此功能覆盖该方法。

3 个答案:

答案 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”字符长,并且货币字符串将带有前缀。

如果你还想避免它,我想只是不使用这种模式就足够了