File Coverage

blib/lib/Algorithm/CheckDigits/M10_009.pm
Criterion Covered Total %
statement 47 52 90.3
branch 9 16 56.2
condition 3 6 50.0
subroutine 11 11 100.0
pod 4 5 80.0
total 74 90 82.2


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