必要に応じて動作するように、この関数のオーバーライドを実装するのは比較的簡単です。
プラグインコードは、それが何をするかについてはほとんど些細なことです。インストールした場所からコピーを取り、コードベースの一部にすることで、コンパイル中に検出されるバージョンになります。
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'