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


function Add-SEDOLCheckDigit
    {
    Param ( #  Validate input as six-digit SEDOL number
            [ValidatePattern( "^[0123456789bcdfghjklmnpqrstvwxyz]{6}$" )]
            [parameter ( Mandatory = $True ) ]
            [string]
            $SixDigitSEDOL )
 
    #  Convert to array of single character strings, using type char as an intermediary
    $SEDOL = [string[]][char[]]$SixDigitSEDOL
 
    #  Define place weights
    $Weight = @( 1, 3, 1, 7, 3, 9 )
 
    #  Define character values (implicit in 0-based location within string)
    $Characters = "0123456789abcdefghijklmnopqrstuvwxyz"
 
    $CheckSum = 0
 
    #  For each digit, multiply the character value by the weight and add to check sum
    0..5 | ForEach { $CheckSum += $Characters.IndexOf( $SEDOL[$_].ToLower() ) * $Weight[$_] }
 
    #  Derive the check digit from the partial check sum
    $CheckDigit = ( 10 - $CheckSum % 10 ) % 10
 
    #  Return concatenated result
    return ( $SixDigitSEDOL + $CheckDigit )
    }
 
#  Test
$List = @(
    "710889"
    "B0YBKJ"
    "406566"
    "B0YBLH"
    "228276"
    "B0YBKL"
    "557910"
    "B0YBKR"
    "585284"
    "B0YBKT"
    "B00030"
    )
 
ForEach ( $PartialSEDOL in $List )
    {
    Add-SEDOLCheckDigit -SixDigitSEDOL $PartialSEDOL
    }