[interchange-cvs] interchange - racke modified 2 files
interchange-cvs at icdevgroup.org
interchange-cvs at icdevgroup.org
Fri Jul 11 08:37:28 UTC 2008
User: racke
Date: 2008-07-11 08:37:28 GMT
Modified: code/OrderCheck isbn.oc
Modified: . WHATSNEW-5.7
Log:
ISBN-13 support added
Revision Changes Path
1.2 interchange/code/OrderCheck/isbn.oc
rev 1.2, prev_rev 1.1
Index: isbn.oc
===================================================================
RCS file: /var/cvs/interchange/code/OrderCheck/isbn.oc,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- isbn.oc 9 Jul 2008 13:54:20 -0000 1.1
+++ isbn.oc 11 Jul 2008 08:37:28 -0000 1.2
@@ -5,33 +5,57 @@
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. See the LICENSE file for details.
#
-# $Id: isbn.oc,v 1.1 2008-07-09 13:54:20 racke Exp $
+# $Id: isbn.oc,v 1.2 2008-07-11 08:37:28 racke Exp $
CodeDef isbn OrderCheck 1
-CodeDef isbn Description ISBN-10 check digit verification
+CodeDef isbn Description ISBN-10/ISBN-13 check digit verification
CodeDef isbn Routine <<EOR
sub {
my($ref, $var, $val) = @_;
$val =~ s/[^\dXx]//g; # weed out non-digits
- if( $val && length($val) == 10 ) {
+ if ($val) {
my @digits = split("", $val);
- my $sum=0;
- for(my $i=10; $i > 0; $i--) {
- my $d = $digits[10 - $i];
- if ($d =~ /[Xx]/) {
- if ($i == 1) {
- $d = 10;
+ my $sum = 0;
+ my $check_digit = 0;
+ my $modulo;
+
+ if (@digits == 10 ) {
+ # ISBN-10 number
+ for(my $i=10; $i > 0; $i--) {
+ my $d = $digits[10 - $i];
+ if ($d =~ /[Xx]/) {
+ if ($i == 1) {
+ $d = 10;
+ }
+ else {
+ return (undef, $var, errmsg("'%s' not a valid isbn number", $val));
+ }
}
+ $sum += $d * $i;
+ }
+ return ( $sum%11 ? 0 : 1, $var, '' );
+ } elsif (@digits == 13) {
+ # ISBN-13/EAN number
+ for (my $i = 0; $i < 12; $i++) {
+ if ($i % 2) {
+ $sum += 3 * $digits[$i];
+ }
else {
- return (undef, $var, errmsg("'%s' not a valid isbn number", $val));
- }
+ $sum += $digits[$i];
+ }
+ }
+
+ if ($modulo = $sum % 10) {
+ $check_digit = 10 - $modulo;
+ }
+
+ if (pop(@digits) == $check_digit) {
+ # verification successful
+ return (1, $var, '');
}
- $sum += $d * $i;
}
- return ( $sum%11 ? 0 : 1, $var, '' );
- }
- else {
- return (undef, $var, errmsg("'%s' not a valid isbn number", $val));
}
+
+ return (undef, $var, errmsg("'%s' not a valid isbn number", $val));
}
EOR
2.6 interchange/WHATSNEW-5.7
rev 2.6, prev_rev 2.5
Index: WHATSNEW-5.7
===================================================================
RCS file: /var/cvs/interchange/WHATSNEW-5.7,v
retrieving revision 2.5
retrieving revision 2.6
diff -u -r2.5 -r2.6
--- WHATSNEW-5.7 10 Jul 2008 14:56:31 -0000 2.5
+++ WHATSNEW-5.7 11 Jul 2008 08:37:28 -0000 2.6
@@ -30,6 +30,6 @@
OrderCheck
----------
-* relocate isbn order check to code/OrderCheck.
+* added ISBN-13 support to isbn order check and relocated it to code/OrderCheck.
(end)
More information about the interchange-cvs
mailing list