/usr/local/CPAN/String-Numeric/String/Numeric/PP.pm


package String::Numeric::PP;
use strict;
use warnings;

use Carp qw[croak];

BEGIN {
    our $VERSION   = 0.9;
    our @EXPORT_OK = qw(
      is_numeric
      is_float
      is_decimal
      is_integer
      is_int
      is_int8
      is_int16
      is_int32
      is_int64
      is_int128
      is_uint
      is_uint8
      is_uint16
      is_uint32
      is_uint64
      is_uint128
    );

    require Exporter;
    *import = \&Exporter::import;
}

sub INT8_MIN    () { '128' }
sub INT16_MIN   () { '32768' }
sub INT32_MIN   () { '2147483648' }
sub INT64_MIN   () { '9223372036854775808' }
sub INT128_MIN  () { '170141183460469231731687303715884105728' }

sub INT8_MAX    () { '127' }
sub INT16_MAX   () { '32767' }
sub INT32_MAX   () { '2147483647' }
sub INT64_MAX   () { '9223372036854775807' }
sub INT128_MAX  () { '170141183460469231731687303715884105727' }

sub UINT8_MAX   () { '255' }
sub UINT16_MAX  () { '65535' }
sub UINT32_MAX  () { '4294967295' }
sub UINT64_MAX  () { '18446744073709551615' }
sub UINT128_MAX () { '340282366920938463463374607431768211455' }

*is_numeric = \&is_float;
*is_integer = \&is_int;

sub is_float {
    @_ == 1 || croak(q/Usage: is_float(string)/);
    local $_ = $_[0];
    return ( defined && /\A-?(?:0|[1-9][0-9]*)(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\z/ );
}

sub is_decimal {
    @_ == 1 || croak(q/Usage: is_decimal(string)/);
    local $_ = $_[0];
    return ( defined && /\A-?(?:0|[1-9][0-9]*)(?:\.[0-9]+)?\z/ );
}

sub is_int {
    @_ == 1 || croak(q/Usage: is_int(string)/);
    local $_ = $_[0];
    return ( defined && /\A-?(?:0|[1-9][0-9]*)\z/ );
}

sub is_int8 {
    @_ == 1 || croak(q/Usage: is_int8(string)/);
    local $_ = $_[0];
    return ( defined
          && /\A(-?)(0|[1-9][0-9]{0,2})\z/
          && ( length $2 < 3 || ( $1 ? $2 le INT8_MIN : $2 le INT8_MAX ) ) );
}

sub is_int16 {
    @_ == 1 || croak(q/Usage: is_int16(string)/);
    local $_ = $_[0];
    return ( defined
          && /\A(-?)(0|[1-9][0-9]{0,4})\z/
          && ( length $2 < 5 || ( $1 ? $2 le INT16_MIN : $2 le INT16_MAX ) ) );
}

sub is_int32 {
    @_ == 1 || croak(q/Usage: is_int32(string)/);
    local $_ = $_[0];
    return ( defined
          && /\A(-?)(0|[1-9][0-9]{0,9})\z/
          && ( length $2 < 10 || ( $1 ? $2 le INT32_MIN : $2 le INT32_MAX ) ) );
}

sub is_int64 {
    @_ == 1 || croak(q/Usage: is_int64(string)/);
    local $_ = $_[0];
    return ( defined
          && /\A(-?)(0|[1-9][0-9]{0,18})\z/
          && ( length $2 < 19 || ( $1 ? $2 le INT64_MIN : $2 le INT64_MAX ) ) );
}

sub is_int128 {
    @_ == 1 || croak(q/Usage: is_int128(string)/);
    local $_ = $_[0];
    return ( defined
          && /\A(-?)(0|[1-9][0-9]{0,38})\z/
          && ( length $2 < 39 || ( $1 ? $2 le INT128_MIN : $2 le INT128_MAX ) ) );
}

sub is_uint {
    @_ == 1 || croak(q/Usage: is_uint(string)/);
    local $_ = $_[0];
    return ( defined && /\A(?:0|[1-9][0-9]*)\z/ );
}

sub is_uint8 {
    @_ == 1 || croak(q/Usage: is_uint8(string)/);
    local $_ = $_[0];
    return ( defined
          && /\A(0|[1-9][0-9]{0,2})\z/
          && ( length $1 < 3 || $1 le UINT8_MAX ) );
}

sub is_uint16 {
    @_ == 1 || croak(q/Usage: is_uint16(string)/);
    local $_ = $_[0];
    return ( defined
          && /\A(0|[1-9][0-9]{0,4})\z/
          && ( length $1 < 5 || $1 le UINT16_MAX ) );
}

sub is_uint32 {
    @_ == 1 || croak(q/Usage: is_uint32(string)/);
    local $_ = $_[0];
    return ( defined
          && /\A(0|[1-9][0-9]{0,9})\z/
          && ( length $1 < 10 || $1 le UINT32_MAX ) );
}

sub is_uint64 {
    @_ == 1 || croak(q/Usage: is_uint64(string)/);
    local $_ = $_[0];
    return ( defined
          && /\A(0|[1-9][0-9]{0,19})\z/
          && ( length $1 < 20 || $1 le UINT64_MAX ) );
}

sub is_uint128 {
    @_ == 1 || croak(q/Usage: is_uint128(string)/);
    local $_ = $_[0];
    return ( defined
          && /\A(0|[1-9][0-9]{0,38})\z/
          && ( length $1 < 39 || $1 le UINT128_MAX ) );
}

1;