Re: [xsl] XPath MOD 10 calculation

Subject: Re: [xsl] XPath MOD 10 calculation
From: Abel Braaksma <abel.online@xxxxxxxxx>
Date: Fri, 25 May 2007 16:17:33 +0200
Andrew Welch wrote:
On 5/25/07, David Carlisle <davidc@xxxxxxxxx> wrote:

> <xsl:variable name="calc" select="(10 - ((sum($odd) * 3) + > sum($even)) mod 10) mod 10" as="xs:integer"/> > <xsl:if test="$calc ne $check-digit">UPC not legal</xsl:if>

foo mod 10 mod 10  is the same as foo mod 10, and 10 mod 10 is 0 so the
above is

<xsl:if test="($check-digit + ((sum($odd) * 3) + sum($even))) mod 10 =0">

Nice!


That give a boolean to check the UPC is correct - is it ok to re-write it as:

10 - ((sum($odd) * 3) + sum($even)) mod 10

to give you the check-digit?  If so it makes the outermost "mod 10" of
$calc redundant?  (if it is then step #4 on the wikipedia article isnt
needed)

It is needed for calculating the check digit, in the special case that the steps 1..3 produce 10 (which is, if the $totalsums mod 10 equal 0). 10 is not allowed as digit. Doing modulo 10, will give 0.


Example:
Suppose your 11-digit number is 12345678950
When you apply the algorithm sums it gives you 100
Step 3 is now: 10 - 100 mod 10 = 10 - 0 = 10
Step 4 (now necessary) gives: 10 mod 10 = 0
ergo: check digit is 0. The UPC-A string becomes 123456789500

This special case works correctly with the tests posted here afaik. As it comes, the 12345678950 is a valid Luhn number. All others (not having a check digit of 0) are invalid Luhn numbers.

Cheers,
-- Abel Braaksma

Current Thread