Task

For each number list of 6-digit SEDOLs, calculate and append the checksum digit.



That is, given this input:

710889
B0YBKJ
406566
B0YBLH
228276
B0YBKL
557910
B0YBKR
585284
B0YBKT
B00030

Produce this output:

7108899
B0YBKJ7
4065663
B0YBLH2
2282765
B0YBKL9
5579107
B0YBKR5
5852842
B0YBKT7
B000300

Extra credit

Check each input is correctly formed, especially with respect to valid characters allowed in a SEDOL string.



Related tasks

   Luhn test
   ISIN


Procedure.s SEDOLs(rawstring$)
  Protected i, j, sum, c, m
  For i=1 To Len(rawstring$)
    c=Asc(Mid(rawstring$,i,1))
    Select c
      Case Asc("0") To Asc("9")
        j=Val(Mid(rawstring$,i,1))
      Default
        j=c-Asc("A")
    EndSelect
    Select i
      Case 1, 3, 7:  m=1
      Case 2, 5:     m=3
      Case 4:        m=7
      Default:       m=9
    EndSelect
    sum+j*m
  Next
  sum=(10-(sum%10))%10
  ProcedureReturn rawstring$+Str(sum)
EndProcedure
 
Define result$, i
Restore Tests
For i=0 To 10
  Read.s  SEDOL$
  result$+SEDOLs(SEDOL$)
  If i%2
    result$+#CRLF$
  ElseIf i<10
    result$+", "
  EndIf
Next
MessageRequester("SEDOLs","Result"+#CRLF$+result$)
 
DataSection
  Tests:
  Data.s  "710889","B0YBKJ","406566","B0YBLH","228276"
  Data.s  "B0YBKL","557910","B0YBKR","585284","B0YBKT","B00030"
EndDataSection