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; }
In reply to Re: Summing the odd/even digits of a larger number (for upc check digits)...a better way?
by roboticus
in thread Summing the odd/even digits of a larger number (for upc check digits)...a better way?
by EvanK
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |