package Format::Sanitize::Number 0.1;

use 5.008;
use strict;
use warnings;

use Error q/:try/;
use Format::Sanitize;
use base('Format::Sanitize');
our @EXPORT_OK = qw/
    money
    money_integer
    money_decimal
/;
our %EXPORT_TAGS = (
    'money' => [qw/
        money
        money_integer
        money_decimal
    /]
);

use Carp q/croak/;
use POSIX q/floor/;
use Scalar::Util q/looks_like_number/;
use aliased 'Format::Error::ValueProvideException';
use aliased 'Format::Error::ValueNumericException';

sub money {

    my $value = shift || die ValueProvideException->new->stacktrace;

    my ($integer, $decimal) = split /\./, $value;
    money_integer($integer).money_decimal($decimal);
}

sub money_integer {

    my $value = shift || die ValueProvideException->new->stacktrace;
    die ValueNumericException->new->stacktrace unless looks_like_number $value;

    $value = reverse floor($value);
    $value =~ s/(\d{3})(?!$)/$1./g;
    reverse $value;
}

sub money_decimal {

    my $value = shift;

    return $value && looks_like_number $value
    ? ','.$value
    : ',00';
}
1