`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