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


' version 05-07-2015
' compile with: fbc -s console
 
Function check_sedol(input_nr As String) As Integer
    input_nr = Trim(input_nr)
    Dim As Integer i, j, x, nr_begin, sum
    Dim As String ch, legal = "AEIOU0123456789BCDFGHJKLMNPQRSTVWXYZ"
    Dim As Integer weight(0 To ...) = { 1, 3, 1, 7, 3, 9, 1}
 
    x = Len(input_nr)
    If x < 6 Or x > 7 Then
        Return -99 ' to long or to short
    End If
 
    For i = 0 To 5
        ch = Chr(input_nr[i])
        j = InStr(legal,ch)
        If j < 6 Then
            Return -90+j ' not a legal char. or a vowel
        End If
        j = ch[0] - Asc("0")
        If j > 9 Then j = j + (Asc("0") + 10- Asc("A"))
        If i = 0 AndAlso j < 10 Then nr_begin = 1
        If nr_begin = 1 AndAlso i > 0 Then
            If j > 9 Then Return -97 ' first is number then all be numbers
        End If
        sum = sum + j * weight(i)
    Next
    sum= ((10 - (sum Mod 10)) Mod 10)
    If x = 7 Then
        j=input_nr[6] - Asc("0") ' checksum digit is only number
        If j = sum Then
            Return 100+sum ' correct
        Else
            Return -98   ' wrong
        End If
    End If
 
    Return sum ' checksum digit
 
End Function
 
Sub sedol(in As String)
 
    Dim As Integer checksum = check_sedol(in)
    Print(in);
 
    Select Case checksum
        Case -99
            Print " Illegal SEDOL: wrong length"
        Case -98
            Print " Illegal SEDOL: checksum digits do not match"
        Case -97
            Print " Illegal SEDOL: starts with number, may only contain numbers"
        Case -90
            Print " Illegal SEDOL: illegal character"
        Case -89 To -85
            Print " Illegal SEDOL: No vowels allowed"
        Case Is > 99
            Print " Valid SEDOL: checksums match"
        Case Else
            Print " checksum calculated : ";in;Str(checksum)
    End Select
 
End Sub
' ------=< MAIN >=------
 
Dim As Integer k,checksum
Dim As String in(1 To ...) = {"710889", "B0YBKJ", "406566", "B0YBLH",_
                              "228276", "B0YBKL", "557910", "B0YBKR",_
                                        "585284", "B0YBKT", "B00030"}
 
Print "Calculated checksum"
For k = 1 To UBound(in) : sedol(in(k)) : Next
 
Print : Print "Check checksum"
Dim As String in1(1 To ...) = {"7108899", "B0YBKJ7", "4065663", "B0YBLH2",_
                                "2282765", "B0YBKL9","5579107", "B0YBKR5",_
                                          "5852842", "B0YBKT7", "B000300"}
 
For k = 1 To UBound(in1) : sedol(in1(k)) : Next
 
Print : Print "Error test"
Dim As String errors(1 To ...) = {"12", "1234567890", "1B0000", "123 45",_
                                                     "A00000", "B000301"}
 
For k = 1 To UBound(errors) : sedol(errors(k)) : Next
 
' empty keyboard buffer
While Inkey <> "" : Wend
Print : Print "hit any key to end program"
Sleep
End