File: M07_001.pm

package info (click to toggle)
libalgorithm-checkdigits-perl 0.48-1
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 324 kB
  • ctags: 312
  • sloc: perl: 2,939; makefile: 44
file content (154 lines) | stat: -rw-r--r-- 2,672 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
package Algorithm::CheckDigits::M07_001;

use 5.006;
use strict;
use warnings;

our @ISA = qw(Algorithm::CheckDigits);

sub new {
	my $proto = shift;
	my $class = ref($proto) || $proto;
	return bless({}, $class);
} # new()

sub is_valid {
	my ($self,$number) = @_;
	if ($number =~ /^([0-9]*)([0-9])$/) {
		return ($2 == _compute_checkdigit($1));
	}
	return 0;
} # is_valid()

sub complete {
	my ($self,$number) = @_;
	if ($number =~ /^([0-9]*)$/) {
		return $number . _compute_checkdigit($1);
	}
	return undef;
} # complete()

sub basenumber {
	my ($self,$number) = @_;
	if ($number =~ /^([0-9]*)([0-9])$/) {
		return $1 if ($2 == _compute_checkdigit($1));
	}
	return undef;
} # basenumber()

sub checkdigit {
	my ($self,$number) = @_;
	if ($number =~ /^([0-9]*)([0-9])$/) {
		return $2 if ($2 == _compute_checkdigit($1));
	}
	return undef;
} # checkdigit()

sub _compute_checkdigit {
	my $number = shift;
	my @digits = split(//,$number);
	my $even   = 0;
	my $sum    = 0;
	foreach my $digit (@digits) {
		$sum += $digit;
		$sum += $digit if ($even);
		$even = not $even;
	}
	return $sum % 7;
} # _compute_checkdigit()

# Preloaded methods go here.

1;
__END__

=head1 NAME

CheckDigits::M07_001 - compute check digits modulo 7 method 1

=head1 SYNOPSIS

  use Algorithm::CheckDigits;

  $m001 = CheckDigits('m001');

  if ($m001->is_valid('1234567892')) {
	# do something
  }

  $cn = $m001->complete('123456789');    # $cn = '1234567892'

  $cd = $m001->checkdigit('1234567892'); # $cd = '2'

  $bn = $m001->basenumber('1234567892'); # $bn = '123456789'
  
=head1 DESCRIPTION

=head2 ALGORITHM

=over 4

=item 1.

All digits are added.

=item 2.

All digits at even positions are added.

=item 3.

The sum of step 1 and 2 is taken modulo 7.

=item 4.

This is the check digit.

=back

=head2 METHODS

=over 4

=item is_valid($number)

Returns true only if C<$number> consists solely of numbers and the last digit
is a valid check digit according to the algorithm given above.

Returns false otherwise,

=item complete($number)

The check digit for C<$number> is computed and concatenated to the end
of C<$number>.

Returns the complete number with check digit or undef if C<$number>
does not consist solely of digits.

=item basenumber($number)

Returns the basenumber of C<$number> if C<$number> has a valid check
digit.

Return undef otherwise.

=item checkdigit($number)

Returns the check digit belonging to C<$number> or undef if C<$number> does
not consist solely of digits.

=back

=head2 EXPORT

None by default.

=head1 AUTHOR

Mathias Weidner, E<lt>mathias@weidner.in-bad-schmiedeberg.deE<gt>

=head1 SEE ALSO

L<perl>, F<www.pruefziffernberechnung.de>.

=cut