1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
|
package HTML::FormHandler::Field::Money;
# ABSTRACT: US currency-like values
$HTML::FormHandler::Field::Money::VERSION = '0.40067';
use HTML::FormHandler::Moose;
extends 'HTML::FormHandler::Field::Text';
has '+html5_type_attr' => ( default => 'number' );
has 'currency_symbol' => (
is => 'ro',
isa => 'Str',
default => '$',
);
has 'allow_commas' => (
is => 'ro',
isa => 'Bool',
default => 0,
);
our $class_messages = {
'money_convert' => 'Value cannot be converted to money',
'money_real' => 'Value must be a real number',
};
sub get_class_messages {
my $self = shift;
return {
%{ $self->next::method },
%$class_messages,
}
}
apply(
[ { # remove any leading currency symbol
transform => sub {
my ( $value, $field ) = @_;
my $c = $field->currency_symbol;
$value =~ s/^\Q$c\E// if $c;
return $value;
},
},
{ # check number looks real, optionally allow comma digit groupings
check => sub {
my ( $value, $field ) = @_;
return $field->allow_commas
? $value =~ /^[-+]?(?:\d+|\d{1,3}(,\d{3})*)(?:\.\d+)?$/
: $value =~ /^[-+]?\d+(?:\.\d+)?$/;
},
message => sub {
my ( $value, $field ) = @_;
return [ $field->get_message('money_real'), $value ];
},
},
{ # remove commas
transform => sub {
my ($value, $field) = @_;
$value =~ tr/,//d if $field->allow_commas;
return $value;
},
},
{ # convert to standard number, formatted to 2 decimal palaces
transform => sub { sprintf '%.2f', $_[0] },
message => sub {
my ( $value, $field ) = @_;
return [ $field->get_message('money_convert'), $value ];
},
},
]
);
__PACKAGE__->meta->make_immutable;
use namespace::autoclean;
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
HTML::FormHandler::Field::Money - US currency-like values
=head1 VERSION
version 0.40067
=head1 DESCRIPTION
Validates that a positive or negative real value is entered.
Formatted with two decimal places.
Uses a period for the decimal point. Widget type is 'text'.
If form has 'is_html5' flag active it will render <input type="number" ... />
instead of type="text"
=head1 ATTRIBUTES
=head2
=over
=item currency_symbol
Currency symbol to remove from start of input if found, default is dollar
C<$>.
=item allow_commas
Allow commas in input for digit grouping? Digits are grouped into groups of 3,
for example C<1,000,000,000>. Defaults to I<false>.
=back
=head1 AUTHOR
FormHandler Contributors - see HTML::FormHandler
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2016 by Gerda Shank.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut
|