perl5i

 view release on metacpan or  search on metacpan

lib/perl5i/2/SCALAR.pm  view on Meta::CPAN

}


require POSIX;
*ceil  = \&POSIX::ceil;
*floor = \&POSIX::floor;
*round_up   = \&ceil;
*round_down = \&floor;
sub round {
    return 0 if $_[0] == 0;

    if( $_[0]->is_positive ) {
        abs($_[0] - int($_[0])) < 0.5 ? round_down($_[0])
                                      : round_up($_[0])
    }
    else {
        abs($_[0] - int($_[0])) < 0.5 ? round_up($_[0])
                                      : round_down($_[0])
    }
}

require Scalar::Util;
*is_number = \&Scalar::Util::looks_like_number;
sub is_positive         { $_[0]->is_number && $_[0] > 0 }
sub is_negative         { $_[0]->is_number && $_[0] < 0 }
sub is_integer          {
    return 0 if !$_[0]->is_number;
    return $_[0] =~ m{ ^[+-]? \d+ $}x;
}
*is_int = \&is_integer;
sub is_even             { $_[0]->is_integer && !($_[0] % 2) }
sub is_odd              { $_[0]->is_integer && ($_[0] % 2) }
sub is_decimal          {
    return 0 if !$_[0]->is_number;

    # Fast and reliable way to spot most decimals
    return 1 if ((int($_[0]) - $_[0]) != 0);

    # Final gate for tricky things like 1.0, 1. and .0
    return $_[0] =~ m{^ [+-]? (?: \d+\.\d* | \.\d+ ) $}x;
}

sub group_digits {
    my($self, $opts) = @_;

    state $defaults = {
        thousands_sep   => ",",
        grouping        => 3,
        decimal_point   => ".",
    };

    my $is_money = $opts->{currency};
    my $sep           = $opts->{separator}     // (_get_from_locale("thousands_sep", $is_money)
                                                   || $defaults->{thousands_sep});
    my $grouping      = $opts->{grouping}      // (_get_grouping($is_money)
                                                   || $defaults->{grouping});
    my $decimal_point = $opts->{decimal_point} // (_get_from_locale("decimal_point", $is_money) 
                                                   || $defaults->{decimal_point});
    return $self if $grouping == 0;

    my($integer, $decimal) = split m{\.}, $self, 2;

    $integer = CORE::reverse $integer;
    $integer =~ s/(\d{$grouping})(?=\d)(?!\d*\.)/$1$sep/g;
    $integer = CORE::reverse $integer;

    my $number = $integer;
    $number .= $decimal_point . $decimal if defined $decimal;

    return $number;
}

sub commify {
    my($self, $args) = @_;

    state $defaults = {
        separator       => ",",
        grouping        => 3,
        decimal_point   => ".",
    };

    my $opts = $defaults->merge($args);

    return $self->group_digits( $opts );
}


sub _get_lconv {
    return eval {
        require POSIX;
        POSIX::localeconv();
    } || {};
}

sub _get_grouping {
    my $is_money = shift;
    my $key = $is_money ? "mon_grouping" : "grouping";

    my $lconv = _get_lconv;

    if( $lconv->{$key} ) {
        return (unpack("C*", $lconv->{$key}))[0];
    }
    else {
        return;
    }
}

sub _get_from_locale {
    my($key, $is_money) = @_;
    $key = "mon_$key" if $is_money;

    my $lconv = _get_lconv;
    return $lconv->{$key};
}


sub path2module {
    my $path = shift;

    my($vol, $dirs, $file) = File::Spec->splitpath($path);



( run in 1.519 second using v1.01-cache-2.11-cpan-71847e10f99 )