in reply to Summing the odd/even digits of a larger number (for upc check digits)...a better way?
Mine still splits & loops. I made only small changes:
I first got rid of the if even/odd in the first while loop by shifting the values off the array in pairs. I got rid of the second while loop by direct calculation.#!/usr/bin/perl -w use strict; use warnings; # returns error message on failure, undefined value on success sub checkUPCrobot { # grab and immediately split upc into array, 1 char per element my @chars = split(//, shift); # return error message if incorrect length if( $#chars != 11 ) { return "should be 12 digits in length"; } # loop through to seperately sum even and odd chars my $odd=shift @chars; my $even=0; foreach (0..4) { $even += shift @chars; $odd += shift @chars; } # calculate correct check digit my $mult = ($odd * 3) + $even; my $check = 10 - ($mult%10); # return error message if wrong check digit was initially given if($check != shift @chars) { return "invalid checkdigit...should be $check"; } # otherwise, if validated, return undefined return; } #...snipped out the original checkUPC here to save space... print &checkUPC("142687305632"), "\n"; print &checkUPCrobot("142687305632"), "\n";
UPDATE: I fiddled with it a little longer and came up with a slightly improved model:
--roboticus# returns error message on failure, undefined value on success sub checkUPCrobot2 { # grab and immediately split upc into array, 1 char per element my @chars = split //, shift; # return error message if incorrect length return "should be 12 digits in length" if $#chars != 11; my ($even, $odd, $check); foreach (0..5) { $odd += shift @chars; $check = shift @chars; $even += $check; } my $mult = 3*$odd+$even-$check; my $chk2 = 10 - ($mult%10); return "invalid checkdigit...should be $chk2" if $check!=$chk2; }
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Summing the odd/even digits of a larger number (for upc check digits)...a better way?
by GrandFather (Saint) on Jun 23, 2006 at 00:02 UTC | |
by roboticus (Chancellor) on Jun 23, 2006 at 00:29 UTC | |
by GrandFather (Saint) on Jun 23, 2006 at 00:39 UTC | |
by ikegami (Patriarch) on Jun 23, 2006 at 01:01 UTC | |
by roboticus (Chancellor) on Jun 23, 2006 at 01:01 UTC |