Codebase list libbusiness-ismn-perl / 880209e
* fixed checksum routine. the old test data ended in zero, so when i kept getting zero, it didn't realize something was wrong. when i added more ISMNs, it figured it out. brian d foy 21 years ago
3 changed file(s) with 83 addition(s) and 18 deletion(s). Raw diff Collapse all Expand all
0 M-021-76543-0
0 M-706208-05-3
1 M-706208-01-5
2 M-706208-02-2
3 M-706208-05-3
4 M-706208-06-0
5 M-706208-09-1
6 M-706208-10-7
7 M-706208-11-4
8 M-706208-12-1
9 M-706217-00-0
10 M-706217-01-7
11 M-706217-02-4
12 M-706228-01-3
13 M-706228-02-0
14 M-50093-001-3
15 M-2020-0651-1
16 M-2020-0291-9
17 M-2019-7401-9
18 M-50093-001-3
19 M-50093-002-0
20 M-50093-005-1
21 M-50093-007-5
22 M-50093-008-2
23 M-50093-010-5
24 M-50093-011-2
25 M-50093-012-9
26 M-50093-015-0
27 M-50093-016-7
28 M-50093-017-4
29 M-50093-018-1
30 M-50093-020-4
31 M-50093-021-1
32 M-50093-022-8
33 M-50093-023-5
34 M-50093-024-2
35 M-50093-025-9
36 M-50093-026-6
37 M-50093-027-3
38 M-50093-029-7
39 M-50093-030-3
40 M-50093-031-0
41 M-50093-032-7
42 M-50093-026-6
43 M-50093-028-0
44 M-50093-033-4
45 M-50093-029-7
46 M-50093-034-1
47 M-50093-035-8
48 M-50093-035-8
49 M-50093-032-7
50 M-50093-036-5
51 M-50093-024-2
52 M-50093-009-9
53 M-50093-038-9
54 M-50093-039-6
55 M-50093-016-7
56 M-50093-041-9
57
00 package Business::ISMN;
1 # $Revision: 1.1 $
2 # $Id: ISMN.pm,v 1.1 2002/09/09 16:38:25 comdog Exp $
1 # $Revision: 1.2 $
2 # $Id: ISMN.pm,v 1.2 2002/09/09 19:52:01 uid59984 Exp $
33
44 use strict;
55 use subs qw( _common_format _checksum is_valid_checksum
1313
1414 use Exporter;
1515 use List::Util qw(sum);
16 use Tie::Toggle;
16 use Tie::Cycle;
1717 use Business::ISMN::Data;
1818
1919 my $debug = 0;
2222 @EXPORT_OK = qw(is_valid_checksum ean_to_ismn ismn_to_ean
2323 INVALID_PUBLISHER_CODE BAD_CHECKSUM GOOD_ISMN BAD_ISMN);
2424
25 ($VERSION) = q$Revision: 1.1 $ =~ m/(\d+\.\d+)\s*$/;
25 ($VERSION) = q$Revision: 1.2 $ =~ m/(\d+\.\d+)\s*$/;
2626
2727 sub INVALID_PUBLISHER_CODE { -3 };
2828 sub BAD_CHECKSUM { -1 };
259259 sub _checksum
260260 {
261261 my $data = _common_format shift;
262 $data =~ s/^M/1/i;
263
264 tie my $factor, 'Tie::Toggle', [ 3, 1 ];
262
263 tie my $factor, 'Tie::Cycle', [ 1, 3 ];
265264 return unless defined $data;
266265
267 my $sum = sum( map $factor * $_, substr( $data, 0, 9 ) );
268
266 my $sum = 9;
267
268 foreach my $digit ( split //, substr( $data, 1, 8 ) )
269 {
270 my $mult = $factor;
271 $sum += $digit * $mult;
272 }
273
274
269275 #return what the check digit should be
270 my $checksum = $sum % 10;
271
276 # the extra mod 10 turns 10 into 0.
277 my $checksum = ( 10 - ($sum % 10) ) % 10;
278
272279 return $checksum;
273280 }
274281
0 # $Revision: 1.1 $
0 # $Revision: 1.2 $
11
22 use Test::More tests => 18;
33
44 use Business::ISMN;
55
6 my $GOOD_ISMN = "M021765430";
7 my $GOOD_ISMN_STRING = "M-021-76543-0";
8 my $GOOD_EAN = "9790021765439";
9 my $PUBLISHER = "021";
10 my $BAD_CHECKSUM_ISMN = "M021765436";
6 my $GOOD_ISMN = "M706208053";
7 my $GOOD_ISMN_STRING = "M-706208-05-3";
8 my $GOOD_EAN = "9790706208053";
9 my $PUBLISHER = "706208";
10 my $BAD_CHECKSUM_ISMN = "M706208057";
1111 my $BAD_PUBLISHER_ISMN = "M456922572";
1212 my $NULL_ISMN = undef;
1313 my $NO_GOOD_CHAR_ISMN = "abcdefghij";
7474 while( <FILE> )
7575 {
7676 chomp;
77 next unless /\S+/;
7778 my $ismn = Business::ISMN->new( $_ );
7879
7980 my $result = $ismn->is_valid;