Prev: What is the difference between the two streams 5.3 and5.2 versions and What is the need for maintaining two streams?
Next: jsonDebug/htmlMicroscope 1.1.0 - auto-includes a full function trace and displays arrays > 1.6Mb fine
From: "Angus Mann" on 5 Jan 2010 06:05 Hi all. Perhaps a lazy request, but does anybody have some cut-n-paste code to calculate a Luhn check-digit? It's a check-digit often added to the end of things like credit card or account numbers to make detecting typo's a bit easier. I found lots of code to validate a number once the check-digit is applied, but nothing to calculate the digit in the first place. Thanks in advance ! Angus
From: Per Jessen on 5 Jan 2010 06:11 Angus Mann wrote: > Hi all. Perhaps a lazy request, but does anybody have some cut-n-past= e > code to calculate a Luhn check-digit? >=20 http://de.wikipedia.org/wiki/Luhn-Algorithmus (several examples, including one in PHP). /Per --=20 Per Jessen, Z=C3=BCrich (0.0=C2=B0C)
From: Richard Quadling on 5 Jan 2010 06:18 2010/1/5 Angus Mann <angusmann(a)pobox.com>: > Hi all. Perhaps a lazy request, but does anybody have some cut-n-paste code to calculate a Luhn check-digit? > > It's a check-digit often added to the end of things like credit card or account numbers to make detecting typo's a bit easier. > > I found lots of code to validate a number once the check-digit is applied, but nothing to calculate the digit in the first place. > > Thanks in advance ! > Angus > > Modified version found at http://blog.planzero.org/2009/08/luhn-modulus-implementation-php/ <?php /* Luhn algorithm number checker - (c) 2005-2008 - planzero.org * * This code has been released into the public domain, however please * * give credit to the original author where possible. */ function luhn_check($number) { // If the total mod 10 equals 0, the number is valid return (luhn_process($number) % 10 == 0) ? TRUE : FALSE; } function luhn_process($number) { // Strip any non-digits (useful for credit card numbers with spaces and hyphens) $number=preg_replace('/\D/', '', $number); // Set the string length and parity $number_length=strlen($number); $parity=$number_length % 2; // Loop through each digit and do the maths $total=0; for ($i=0; $i<$number_length; $i++) { $digit=$number[$i]; // Multiply alternate digits by two if ($i % 2 == $parity) { $digit*=2; // If the sum is two digits, add them together (in effect) if ($digit > 9) { $digit-=9; } } // Total up the digits $total+=$digit; } return $total; } function luhn_checkdigit($number) { return 10 - (luhn_process($number . '0') % 20); } echo '49927398716 is ', (luhn_check('49927398716') ? 'Valid' : 'Invalid'), PHP_EOL; echo 'The check digit for 4992739871 is ', luhn_checkdigit('4992739871'), PHP_EOL; ?> outputs ... 49927398716 is Valid The check digit for 4992739871 is 6 -- ----- Richard Quadling "Standing on the shoulders of some very clever giants!" EE : http://www.experts-exchange.com/M_248814.html Zend Certified Engineer : http://zend.com/zce.php?c=ZEND002498&r=213474731 ZOPA : http://uk.zopa.com/member/RQuadling
From: Richard Quadling on 5 Jan 2010 06:19
2010/1/5 Richard Quadling <rquadling(a)googlemail.com>: > 2010/1/5 Angus Mann <angusmann(a)pobox.com>: >> Hi all. Perhaps a lazy request, but does anybody have some cut-n-paste code to calculate a Luhn check-digit? >> >> It's a check-digit often added to the end of things like credit card or account numbers to make detecting typo's a bit easier. >> >> I found lots of code to validate a number once the check-digit is applied, but nothing to calculate the digit in the first place. >> >> Thanks in advance ! >> Angus >> >> > > Modified version found at > http://blog.planzero.org/2009/08/luhn-modulus-implementation-php/ > > <?php > /* Luhn algorithm number checker - (c) 2005-2008 - planzero.org       * >  * This code has been released into the public domain, however please    * >  * give credit to the original author where possible.            */ > > function luhn_check($number) { >  // If the total mod 10 equals 0, the number is valid >  return (luhn_process($number) % 10 == 0) ? TRUE : FALSE; > > } > > function luhn_process($number) { > >  // Strip any non-digits (useful for credit card numbers with spaces > and hyphens) >  $number=preg_replace('/\D/', '', $number); > >  // Set the string length and parity >  $number_length=strlen($number); >  $parity=$number_length % 2; > >  // Loop through each digit and do the maths >  $total=0; >  for ($i=0; $i<$number_length; $i++) { >   $digit=$number[$i]; >   // Multiply alternate digits by two >   if ($i % 2 == $parity) { >    $digit*=2; >    // If the sum is two digits, add them together (in effect) >    if ($digit > 9) { >     $digit-=9; >    } >   } >   // Total up the digits >   $total+=$digit; >  } > >  return $total; > } > > function luhn_checkdigit($number) { >  return 10 - (luhn_process($number . '0') % 20); > } > > > echo '49927398716 is ', (luhn_check('49927398716') ? 'Valid' : > 'Invalid'), PHP_EOL; > echo 'The check digit for 4992739871 is ', > luhn_checkdigit('4992739871'), PHP_EOL; > ?> > > > outputs ... > > 49927398716 is Valid > The check digit for 4992739871 is 6 > > > > -- > ----- > Richard Quadling > "Standing on the shoulders of some very clever giants!" > EE : http://www.experts-exchange.com/M_248814.html > Zend Certified Engineer : http://zend.com/zce.php?c=ZEND002498&r=213474731 > ZOPA : http://uk.zopa.com/member/RQuadling > And that 20 is a typo. Sorry. function luhn_checkdigit($number) { return 10 - (luhn_process($number . '0') % 10); } -- ----- Richard Quadling "Standing on the shoulders of some very clever giants!" EE : http://www.experts-exchange.com/M_248814.html Zend Certified Engineer : http://zend.com/zce.php?c=ZEND002498&r=213474731 ZOPA : http://uk.zopa.com/member/RQuadling |