HTML::FormFu::Deflator::FormatNumber - Format a number for a locale


HTML-FormFu documentation Contained in the HTML-FormFu distribution.

Index


Code Index:

NAME

Top

HTML::FormFu::Deflator::FormatNumber - Format a number for a locale

SYNOPSIS

Top

    locale: de_DE
    elements:
      - type: Text
        name: number
        deflators:
          - type: FormatNumber
            precision: 4

      - type: Text
        name: price
        deflators:
          - type: FormatNumber
            precision: 2
            trailing_zeroes: 1

    # "123456.22" will be rendered to "123.456,22" (german locale)

locale

If no locale is found, the server's locale will be used.

This method is a special 'inherited accessor', which means it can be set on the form, a enclosing block element, the field, or this filter. When the value is read, if no value is defined it automatically traverses the element's hierarchy of parents, through any block elements and up to the form, searching for a defined value.

AUTHOR

Top

Moritz Onken, onken at houseofdesign.de

SEE ALSO

Top

Is a sub-class of, and inherits methods from HTML::FormFu::Deflator

HTML::FormFu::Filter::FormatNumber

HTML::FormFu

COPYRIGHT & LICENSE

Top


HTML-FormFu documentation Contained in the HTML-FormFu distribution.

package HTML::FormFu::Deflator::FormatNumber;

use Moose;
extends 'HTML::FormFu::Deflator';

use Number::Format;
use POSIX qw( setlocale LC_NUMERIC );

has precision => (
    is      => 'rw',
    default => 2,
    lazy    => 1,
    isa     => 'Int',
    traits  => ['Chained'],
);

has trailing_zeroes => (
    is      => 'rw',
    default => 0,
    lazy    => 1,
    isa     => 'Int',
    traits  => ['Chained'],
);

sub deflator {
    my ( $self, $value ) = @_;

    my $backup_locale = setlocale(LC_NUMERIC);

    if ( my $locale = $self->locale ) {

        # throwing errors from deflator() isn't supported
        # if unable to set locale, return the original value

        setlocale( LC_NUMERIC, $locale )
            or return $value;
    }

    my $format = Number::Format->new;

    $value = $format->format_number( $value, $self->precision,
        $self->trailing_zeroes );

    # restore locale
    setlocale( LC_NUMERIC, $backup_locale );

    return $value;
}

__PACKAGE__->meta->make_immutable;

1;

__END__