File Coverage

blib/lib/Algorithm/CheckDigits/M11_017.pm
Criterion Covered Total %
statement 44 48 91.6
branch 8 16 50.0
condition 1 3 33.3
subroutine 11 11 100.0
pod 4 5 80.0
total 68 83 81.9


line stmt bran cond sub pod time code
1             # vim: set ts=4 sw=4 tw=78 si et:
2             package Algorithm::CheckDigits::M11_017;
3              
4 2     2   36 use 5.006;
  2         7  
5 2     2   10 use strict;
  2         15  
  2         41  
6 2     2   10 use warnings;
  2         4  
  2         60  
7 2     2   531 use integer;
  2         16  
  2         10  
8              
9 2     2   64 use version; our $VERSION = 'v1.3.6';
  2         4  
  2         9  
10              
11             our @ISA = qw(Algorithm::CheckDigits);
12              
13             sub new {
14 2     2 0 5 my $proto = shift;
15 2         4 my $type = shift;
16 2   33     11 my $class = ref($proto) || $proto;
17 2         5 my $self = bless( {}, $class );
18 2         15 $self->{type} = lc($type);
19 2         11 return $self;
20             } # new()
21              
22             sub is_valid {
23 15     15 1 42 my ( $self, $number ) = @_;
24 15 50       78 if ( $number =~ /^([-\d]+)(\d)$/ ) {
25 15         36 return $2 eq $self->_compute_checkdigit($1);
26             }
27 0         0 return '';
28             } # is_valid()
29              
30             sub complete {
31 1     1 1 93 my ( $self, $number ) = @_;
32 1 50       7 if ( $number =~ /^[-\d]+$/ ) {
33 1         3 my $cd = $self->_compute_checkdigit($number);
34 1 50       7 return $number . $cd unless 0 > $cd;
35             }
36 0         0 return '';
37             } # complete()
38              
39             sub basenumber {
40 1     1 1 3 my ( $self, $number ) = @_;
41 1 50       6 if ( $number =~ /^([-\d]+)(\d)$/ ) {
42 1 50       4 return $1 if ( $2 eq $self->_compute_checkdigit($1) );
43             }
44 0         0 return '';
45             } # basenumber()
46              
47             sub checkdigit {
48 1     1 1 3 my ( $self, $number ) = @_;
49 1 50       8 if ( $number =~ /^([-\d.]+)(\d)$/ ) {
50 1 50       3 return $2 if ( $2 eq $self->_compute_checkdigit($1) );
51             }
52 0         0 return '';
53             } # checkdigit()
54              
55             sub _compute_checkdigit {
56 18     18   27 my $self = shift;
57 18         39 my $number = shift;
58 18         31 my ( $cd1, $cd2 ) = ( '', '' );
59              
60 18         57 $number =~ s/[-]//g;
61 18         61 my @digits = split //, $number;
62 18         32 my $sum = 0;
63 18         44 for ( my $i = 0; $i <= $#digits; $i++ ) {
64 108         223 $sum += ( $i + 1 ) * $digits[$i];
65             }
66 18         31 $sum %= 11;
67 18 50       33 return 0 if ( 9 < $sum );
68 18         103 return $sum;
69             } # _compute_checkdigit()
70              
71             # Preloaded methods go here.
72              
73             1;
74             __END__