Algorithm-CheckDigits
view release on metacpan or search on metacpan
lib/Algorithm/CheckDigits/M11_012.pm view on Meta::CPAN
package Algorithm::CheckDigits::M11_012;
use 5.006;
use strict;
use warnings;
use integer;
use version; our $VERSION = 'v1.3.6';
our @ISA = qw(Algorithm::CheckDigits);
my @weight = ( 2,3,4,5,6,7,1,6,7,2,3 );
my %table_to = (
0 => 0, 1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5,
6 => 6, 7 => 7, 8 => 8, 9 => 9, A => 12, B => 14,
C => 16, D => 18, E => 20, F => 22, G => 24, H => 26,
I => 28, J => 6, K => 8, L => 10, M => 12, N => 14,
O => 16, P => 18, Q => 20, R => 22, S => 4, T => 6,
U => 8, V => 10, W => 12, X => 14, Y => 16, Z => 18,
);
sub new {
my $proto = shift;
my $type = shift;
my $class = ref($proto) || $proto;
my $self = bless({}, $class);
$self->{type} = lc($type);
return $self;
} # new()
sub is_valid {
my ($self,$number) = @_;
if ($number =~ /^([-0-9a-z]+)(\d)$/i) {
return $2 == $self->_compute_checkdigits($1);
}
return undef;
} # is_valid()
sub complete {
my ($self,$number) = @_;
if ($number =~ /^([-0-9a-z]+)$/i
and (my $cd = $self->_compute_checkdigits($1)) ne '') {
return $1 . $cd;
}
return undef;
} # complete()
sub basenumber {
my ($self,$number) = @_;
if ($number =~ /^([-0-9a-z]+)(\d)$/i) {
return $1 if ($2 == $self->_compute_checkdigits($1));
}
return undef;
} # basenumber()
sub checkdigit {
my ($self,$number) = @_;
if ($number =~ /^([-0-9a-z]+)(\d)$/i) {
return $2 if ($2 == $self->_compute_checkdigits($1));
}
return undef;
} # checkdigit()
sub _compute_checkdigits {
my $self = shift;
my $number = shift;
$number =~ s/-//g;
my @digits = split(//,$number);
my $len = scalar(@digits) + 1;
my $sum = 0;
for (my $i = 0; $i <= $#digits; $i++) {
$sum += $weight[$i] * $table_to{uc($digits[$i])};
}
$sum %= 11;
return ($sum == 0) ? 1 : ($sum == 1) ? 0 : 11 - $sum;
} # _compute_checkdigit()
# Preloaded methods go here.
1;
__END__
=head1 NAME
( run in 0.579 second using v1.01-cache-2.11-cpan-5a3173703d6 )