Template-Plugin-Number-Format-1.06/000755 000765 000144 00000000000 12506245403 020770 5ustar00darren_lpoperator000000 000000 Template-Plugin-Number-Format-1.06/Format.pm000644 000765 000144 00000017035 12506245365 022573 0ustar00darren_lpoperator000000 000000 package Template::Plugin::Number::Format; # ---------------------------------------------------------------------- # Template::Plugin::Number::Format - Plugin/filter interface to Number::Format # Copyright (C) 2002-2015 Darren Chamberlain # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # ------------------------------------------------------------------- use strict; use vars qw($VERSION $DYNAMIC $AUTOLOAD); $VERSION = '1.06'; $DYNAMIC = 1; use Number::Format; use base qw(Template::Plugin::Filter); # ---------------------------------------------------------------------- # filter($text) # # The default filter is format_number, i.e., commify. # ---------------------------------------------------------------------- sub filter { my ($self, $text, $args) = @_; $self->{ _NFO }->format_number($text, @$args); } # ---------------------------------------------------------------------- # init($config) # # Initialize the instance. Creates a Number::Format object, which is # used to create closures that implement the filters. # ---------------------------------------------------------------------- sub init { my ($self, $config) = @_; my ($sub, $filter, $nfo); $nfo = Number::Format->new(%$config); $self->{ _DYNAMIC } = 1; $self->{ _NFO } = $nfo; # ------------------------------------------------------------------ # This makes is dependant upon Number::Format not changing the # Exporter interface it advertises, which is unlikely. # # It is likely that each of these subroutines should accept all # the configuration options of the constructor, and instantiate a # new Number::Format instance. This is easier, for now. # ------------------------------------------------------------------ for my $sub (@{$Number::Format::EXPORT_TAGS{"subs"}}) { my $filter = sub { my ($context, @args) = @_; return sub { my $text = shift; return $nfo->$sub($text, @args); }; }; $self->{ _CONTEXT }->define_filter($sub, $filter, 1); } return $self; } # ---------------------------------------------------------------------- # AUTOLOAD # # Catches method calls; so that the plugin can be used like you'd # expect a plugin to work: # # [% USE nf = Number.Format; nf.format_number(num) %] # ---------------------------------------------------------------------- sub AUTOLOAD { my $self = shift; (my $autoload = $AUTOLOAD) =~ s/.*:://; return if $autoload eq 'DESTROY'; $self->{ _NFO }->$autoload(@_); } 1; __END__ =head1 NAME Template::Plugin::Number::Format - Plugin/filter interface to Number::Format =head1 SYNOPSIS [% USE Number.Format %] [% num | format_number %] =head1 ABSTRACT Template::Plugin::Number::Format makes the number-munging grooviness of Number::Format available to your templates. It is used like a plugin, but installs filters into the current context. =head1 DESCRIPTION All filters created by Template::Plugin::Number::Format can be configured by constructor options and options that can be passed to individual filters. See L for all the details. =head2 Constructor Parameters The USE line accepts the following parameters, all optional, which define the default behavior for filters within the current Context: =over 4 =item THOUSANDS_SEP character inserted between groups of 3 digits =item DECIMAL_POINT character separating integer and fractional parts =item MON_THOUSANDS_SEP like THOUSANDS_SEP, but used for format_price =item MON_DECIMAL_POINT like DECIMAL_POINT, but used for format_price =item INT_CURR_SYMBOL character(s) denoting currency (see format_price()) =item DECIMAL_DIGITS number of digits to the right of dec point (def 2) =item DECIMAL_FILL boolean; whether to add zeroes to fill out decimal =item NEG_FORMAT format to display negative numbers (def -x) =item KILO_SUFFIX suffix to add when format_bytes formats kilobytes =item MEGA_SUFFIX suffix to add when format_bytes formats megabytes =item GIGA_SUFFIX suffix to add when format_bytes formats gigabytes =back =head1 Using Template::Plugin::Number::Format When you invoke: [% USE Number.Format(option = value) %] the following filters are installed into the current Context: =over 4 =item B Rounds the number to the specified precision. If "$precision" is omitted, the value of the "DECIMAL_DIGITS" parameter is used (default value 2). =item B Formats a number by adding "THOUSANDS_SEP" between each set of 3 digits to the left of the decimal point, substituting "DECIMAL_POINT" for the decimal point, and rounding to the specified precision using "round()". Note that "$precision" is a maximum precision specifier; trailing zeroes will only appear in the output if "$trailing_zeroes" is provided, or the parameter "DECIMAL_FILL" is set, with a value that is true (not zero, undef, or the empty string). If "$precision" is omitted, the value of the "DECIMAL_DIGITS" parameter (default value of 2) is used. =item B Formats a negative number. Picture should be a string that contains the letter "x" where the number should be inserted. For example, for standard negative numbers you might use "-x", while for accounting purposes you might use "(x)". If the specified number begins with a - character, that will be removed before formatting, but formatting will occur whether or not the number is negative. =item B Returns a string based on "$picture" with the "#" characters replaced by digits from "$number". If the length of the integer part of $number is too large to fit, the "#" characters are replaced with asterisks ("*") instead. =item B Returns a string containing "$number" formatted similarly to "format_number()", except that the decimal portion may have trailing zeroes added to make it be exactly "$precision" characters long, and the currency string will be prefixed. If the "INT_CURR_SYMBOL" attribute of the object is the empty string, no currency will be added. If "$precision" is not provided, the default of 2 will be used. =item B Returns a string containing "$number" formatted similarly to "format_number()", except that if the number is over 1024, it will be divided by 1024 and the value of KILO_SUFFIX appended to the end; or if it is over 1048576 (1024*1024), it will be divided by 1048576 and MEGA_SUFFIX appended to the end. Negative values will result in an error. If "$precision" is not provided, the default of 2 will be used. =item B Converts a string as returned by "format_number()", "format_price()", or "format_picture()", and returns the corresponding value as a numeric scalar. Returns "undef" if the number does not contain any digits. =back =head1 SEE ALSO L, L =head1 AUTHOR darren chamberlain Edarren@cpan.orgE Template-Plugin-Number-Format-1.06/Makefile.PL000644 000765 000144 00000000634 12506136252 022746 0ustar00darren_lpoperator000000 000000 use strict; use ExtUtils::MakeMaker; WriteMakefile( 'NAME' => "Template::Plugin::Number::Format", 'VERSION_FROM' => "Format.pm", 'PREREQ_PM' => { "Template" => 2.07, "Number::Format" => 0, }, clean => { FILES => 'Template-Plugin-Number-Format-$(VERSION).tar.gz', }, dist => { PREOP => 'perldoc -t Format.pm > README', }, ); Template-Plugin-Number-Format-1.06/MANIFEST000644 000765 000144 00000000320 12506245403 022114 0ustar00darren_lpoperator000000 000000 Format.pm Makefile.PL MANIFEST t/01.t README META.yml Module meta-data (added by MakeMaker) META.json Module JSON meta-data (added by MakeMaker) Template-Plugin-Number-Format-1.06/META.json000644 000765 000144 00000001565 12506245403 022420 0ustar00darren_lpoperator000000 000000 { "abstract" : "unknown", "author" : [ "unknown" ], "dynamic_config" : 1, "generated_by" : "ExtUtils::MakeMaker version 6.66, CPAN::Meta::Converter version 2.133380", "license" : [ "unknown" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", "version" : "2" }, "name" : "Template-Plugin-Number-Format", "no_index" : { "directory" : [ "t", "inc" ] }, "prereqs" : { "build" : { "requires" : { "ExtUtils::MakeMaker" : "0" } }, "configure" : { "requires" : { "ExtUtils::MakeMaker" : "0" } }, "runtime" : { "requires" : { "Number::Format" : "0", "Template" : "2.07" } } }, "release_status" : "stable", "version" : "1.06" } Template-Plugin-Number-Format-1.06/META.yml000644 000765 000144 00000000737 12506245403 022250 0ustar00darren_lpoperator000000 000000 --- abstract: unknown author: - unknown build_requires: ExtUtils::MakeMaker: 0 configure_requires: ExtUtils::MakeMaker: 0 dynamic_config: 1 generated_by: 'ExtUtils::MakeMaker version 6.66, CPAN::Meta::Converter version 2.133380' license: unknown meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: 1.4 name: Template-Plugin-Number-Format no_index: directory: - t - inc requires: Number::Format: 0 Template: 2.07 version: 1.06 Template-Plugin-Number-Format-1.06/README000644 000765 000144 00000011212 12506245403 021645 0ustar00darren_lpoperator000000 000000 NAME Template::Plugin::Number::Format - Plugin/filter interface to Number::Format SYNOPSIS [% USE Number.Format %] [% num | format_number %] ABSTRACT Template::Plugin::Number::Format makes the number-munging grooviness of Number::Format available to your templates. It is used like a plugin, but installs filters into the current context. DESCRIPTION All filters created by Template::Plugin::Number::Format can be configured by constructor options and options that can be passed to individual filters. See "METHODS" in Number::Format for all the details. Constructor Parameters The USE line accepts the following parameters, all optional, which define the default behavior for filters within the current Context: THOUSANDS_SEP character inserted between groups of 3 digits DECIMAL_POINT character separating integer and fractional parts MON_THOUSANDS_SEP like THOUSANDS_SEP, but used for format_price MON_DECIMAL_POINT like DECIMAL_POINT, but used for format_price INT_CURR_SYMBOL character(s) denoting currency (see format_price()) DECIMAL_DIGITS number of digits to the right of dec point (def 2) DECIMAL_FILL boolean; whether to add zeroes to fill out decimal NEG_FORMAT format to display negative numbers (def -x) KILO_SUFFIX suffix to add when format_bytes formats kilobytes MEGA_SUFFIX suffix to add when format_bytes formats megabytes GIGA_SUFFIX suffix to add when format_bytes formats gigabytes Using Template::Plugin::Number::Format When you invoke: [% USE Number.Format(option = value) %] the following filters are installed into the current Context: round($precision) Rounds the number to the specified precision. If "$precision" is omitted, the value of the "DECIMAL_DIGITS" parameter is used (default value 2). format_number($precision, $trailing_zeros) Formats a number by adding "THOUSANDS_SEP" between each set of 3 digits to the left of the decimal point, substituting "DECIMAL_POINT" for the decimal point, and rounding to the specified precision using "round()". Note that "$precision" is a maximum precision specifier; trailing zeroes will only appear in the output if "$trailing_zeroes" is provided, or the parameter "DECIMAL_FILL" is set, with a value that is true (not zero, undef, or the empty string). If "$precision" is omitted, the value of the "DECIMAL_DIGITS" parameter (default value of 2) is used. format_negative($picture) Formats a negative number. Picture should be a string that contains the letter "x" where the number should be inserted. For example, for standard negative numbers you might use "-x", while for accounting purposes you might use "(x)". If the specified number begins with a - character, that will be removed before formatting, but formatting will occur whether or not the number is negative. format_picture($picture) Returns a string based on "$picture" with the "#" characters replaced by digits from "$number". If the length of the integer part of $number is too large to fit, the "#" characters are replaced with asterisks ("*") instead. format_price($precision) Returns a string containing "$number" formatted similarly to "format_number()", except that the decimal portion may have trailing zeroes added to make it be exactly "$precision" characters long, and the currency string will be prefixed. If the "INT_CURR_SYMBOL" attribute of the object is the empty string, no currency will be added. If "$precision" is not provided, the default of 2 will be used. format_bytes($precision) Returns a string containing "$number" formatted similarly to "format_number()", except that if the number is over 1024, it will be divided by 1024 and the value of KILO_SUFFIX appended to the end; or if it is over 1048576 (1024*1024), it will be divided by 1048576 and MEGA_SUFFIX appended to the end. Negative values will result in an error. If "$precision" is not provided, the default of 2 will be used. unformat_number Converts a string as returned by "format_number()", "format_price()", or "format_picture()", and returns the corresponding value as a numeric scalar. Returns "undef" if the number does not contain any digits. SEE ALSO Template, Number::Format AUTHOR darren chamberlain Template-Plugin-Number-Format-1.06/t/000755 000765 000144 00000000000 12506245403 021233 5ustar00darren_lpoperator000000 000000 Template-Plugin-Number-Format-1.06/t/01.t000755 000765 000144 00000003674 12506245373 021663 0ustar00darren_lpoperator000000 000000 #!/usr/bin/perl # vim: set ft=perl: use strict; use POSIX qw(setlocale LC_ALL); use Template::Test; use Template::Plugin::Number::Format; $Template::Test::DEBUG = 0; my %vars = ( "data1" => "1234567890", "data2" => "1029384756", "neg" => "-30949043", "dec1" => "1937849302.309498032", "dec2" => "42.9", ); setlocale(LC_ALL, "C"); test_expect(\*DATA, undef, \%vars); __DATA__ -- test -- -- name round -- [% USE Number.Format -%] [% dec1 | round %] -- expect -- 1937849302.31 -- test -- -- name format_number -- [% USE Number.Format -%] [% data1 | format_number %] -- expect -- 1,234,567,890 -- test -- -- name format_number -- [% USE Number.Format -%] [% dec2 | format_number(5) %] -- expect -- 42.9 -- test -- -- name format_number -- [% USE Number.Format -%] [% dec2 | format_number(5, 5) %] -- expect -- 42.90000 -- test -- -- name format_negative -- [% USE Number.Format -%] [% neg | format_negative %] -- expect -- -30949043 -- test -- -- name format_negative -- [% USE Number.Format -%] [% neg | format_negative("(x)") %] -- expect -- (30949043) -- test -- -- name format_negative -- [% USE Number.Format(NEG_FORMAT = "(x)") -%] [% neg | format_negative %] -- expect -- (30949043) -- test -- -- name format_price -- [% USE Number.Format -%] [% dec2 | format_price %] -- expect -- USD 42.90 -- test -- -- name format_bytes -- [% USE Number.Format -%] [% data1 | format_bytes %] -- expect -- 1.15G -- test -- -- name format_bytes -- [% USE Number.Format(GIGA_SUFFIX = 'g') -%] [% data1 | format_bytes %] -- expect -- 1.15g -- test -- -- name unformat_number -- [% USE Number.Format -%] [% data1 | format_number | unformat_number %] -- expect -- -- process -- [% data1 %] -- test -- -- name plugin test -- [% USE nf = Number.Format -%] [% nf.format_number(data1) %] -- expect -- -- process -- 1,234,567,890 -- test -- -- name filter plugin test -- [% USE nf = Number.Format -%] [% data1 | $nf %] -- expect -- -- process -- 1,234,567,890