The following comes from Page 54 of Revenue Canada
Taxation publication MC42. ( Jan 1,85. Machine
computation of ......)
Keith (PC1155)
--------------------------------------------------
The Social Insurance Number contains nine digits.
The number consists of eight assigned digits, with
the ninth digit being constructed from the first
eight and acting as a check digit. The accuracy of
transcription of the number may be verified using
the standard modulus 10 check digit formula.
Briefly, the check digit is established by
considering the unit digit of the basic number and
each alternate digit to the left to be a whole
number. This number is multiplied by two and the
digits in the product and the intervening digits
which were not inflated are cross added. The sum
is subtracted from the next highest number ending
in zero. The difference is the check digit.
For the purpose of verifying the Social Insurance
Number, you must consider the basic Social
Insurance Number which consists of the first eight
digits. The example below may better illustrate
the verication method.
Check
Basic No. Digit
Social Insurance Number provided
in your employee's record . . . . . . 123 456 78 2
Make a number from unit position
and each alternate position to the
left . . . . . . . . . . . . . . . . 2 4 6 8
Add the number to itself . . . . . . 2 4 6 8
-----------
Sum . . . . . . . . . . . . . . . . . 4 9 3 6
Cross add the digits in the sum
(4 + 9 + 3 + 6) = . . . . . . . . . . . . . . . . . . . . 22
Cross add intervening digits
(1 + 3 + 5 + 7) = . . . . . . . . . . . . . . . . . . . . 16
---
Total . . . . . . . . . . . . . . . . . . . . . . . . . . 38
If the total is a multiple of 10, the check
digit is 0, otherwise subtract from the next
highest number ending in zero. . . . . . . . . . . . . . . 40
Check digit is . . . . . . . . . . . . . . . . . . . . . . 2
--------------------------------------------------
Below is a BASIC code fragment that checks the number entered.
Note that the number is a string.
REM SIN$ IS THE NUMBER TO BE CHECKED
820 FAIL = 0
IF LEN(SIN$) <> 9 THEN FAIL = 1 : GOTO 830
IF VAL(SIN$) = 0 THEN FAIL = 1 : GOTO 830
REM GET ALTERNATE DIGITS
X$="" : X=0
FOR Z%=1 TO 4
X$=X$+MID$(SIN$,Z%*2,1)
NEXT Z%
REM MULTIPLY BY 2
X$=STR$(VAL(X$)*2)
REM CROSS ADD THE DIGITS
FOR Z%=1 TO LEN(X$)
X=X+VAL(MID$(X$,Z%,1))
NEXT Z%
REM ADD THE INTERVENING DIGITS
FOR Z%=1 TO 7 STEP 2
X=X+VAL(MID$(SIN$,Z%,1))
NEXT Z%
REM SUBTRACT FROM THE NEXT MULTIPLE OF 10
X=(10-(X MOD 10)) MOD 10
REM CHECK THE RESULT AGAINST THE LAST DIGIT OF THE SIN$
IF X <> VAL(RIGHT$(SIN$,1)) THEN FAIL = 1
830 IF FAIL <> 0 THEN PRINT "BAD S.I.N. ";SIN$