Encode-Positive-Digits

 view release on metacpan or  search on metacpan

lib/Encode/Positive/Digits.pm  view on Meta::CPAN

 {my ($number, $digits) = @_;                                                   # Number to decode, encoding digits

  my @b = split //, $digits;
  my $b = @b;
  $b > 1 or confess
   "number of decoding digits supplied($b) too few, must be at least 2";

  my @n = split //, $number;
  my $n = @n;

  for(1..$n)                                                                    # Convert each digit to be decoded with its decimal equivalent
   {my $d = $n[$_-1];
    my $i = index($digits, $d);
    $i < 0 and confess "Invalid digit \"$d\" in number $number at position $_";
    $n[$_-1] = $i;
   }

  my $p = Math::BigInt->new(1);
  my $s = Math::BigInt->new(0);
  for(reverse @n)                                                               # Decode each digit
   {$s += $p * $_;

lib/Encode/Positive/Digits.pm  view on Meta::CPAN

=head1 Synopsis

 use Encode::Positive::Digits;

 ok 101 == Encode::Positive::Digits::encode(  "5", "01");
 ok   5 == Encode::Positive::Digits::decode("101", "01");

 ok "hello world" eq Encode::Positive::Digits::encode(4830138323689, " abcdefghlopqrw");
 ok 4830138323689 == Encode::Positive::Digits::decode("hello world", " abcdefghlopqrw");

The numbers to be encoded or decoded can be much greater than 2**64 via support
from L<Math::BigInt>, such numbers should be placed inside strings to avoid
inadvertent truncation.

  my $n = '1'.('0'x999).'1';

  my $d = Encode::Positive::Digits::decode($n, "01");
  my $e = Encode::Positive::Digits::encode($d, "01");

  ok $n == $e



( run in 0.234 second using v1.01-cache-2.11-cpan-0d8aa00de5b )