1

生成されている文字列が、以下を使用してテンプレートツールキットに渡されて出力されます。

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

その使用format_priceは、ゼロの場合、価格からセントを下げたいと思います。したがって、100.00は100になります

これに対する明確な解決策が見つかりません。

アップデート:

format_priceはこのプロジェクト内の何百もの場所で使用されており、可能であればそれを変更せず、可能であればこの機能でメソッドをオーバーライドしたいと思います。

4

3 に答える 3

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 %]
于 2013-02-06T22:28:26.233 に答える
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アプローチが使用されることを意味しますが、[% number | format_price(2) %]$100.00を表示したいときに呼び出すことでオーバーライドできます。


アップデート

Number :: Formatは、精度=> 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'
于 2013-02-05T05:15:19.297 に答える
0

余分なゼロは特に通貨モード用のようです。

format_price($precision)「format_number()」と同様にフォーマットされた「$ number」を含む文字列を返します。ただし、小数点部分に末尾のゼロを追加して、正確に「$precision」文字の長さにすることができます。通貨文字列は次のようになります。接頭辞。

それでも避けたい場合は、このモードを使用しないだけで十分だと思います

于 2013-02-05T01:22:21.153 に答える