Monday, December 2, 2013

INTERNATIONAL SECURITIES IDENTIFICATION NUMBER AS DEFINED BY WIKIPEDIA


From Wikipedia, the free encyclopedia



An International Securities Identification Number (ISIN) uniquely identifies a security. Its structure is defined in ISO 6166.
(ISO 6166 defines the structure of an International Securities Identifying Number (ISIN). An ISIN uniquely identifies a fungible security. Securities with which ISINs can be used are equities, Fixed income and ETFs only.
ISINs consist of two alphabetic characters, which are the ISO 3166-1 alpha-2 code for the issuing country, nine alpha-numeric digits (the National Securities Identifying Number, or NSIN, which identifies the security), and one numeric check digit. The NSIN is issued by a national numbering agency (NNA) for that country. Regional substitute NNAs have been allocated the task of functioning as NNAs in those countries where NNAs have not yet been established.
ISINs are slowly being introduced worldwide. At present, many countries have adopted ISINs as a secondary measure of identifying securities, but as yet only some of those countries have moved to using ISINs as their primary means of identifying securities.
NNAs cooperate through the Association of National Numbering Agencies (ANNA). ANNA also functions as the ISO 6166 Maintenance Agency (MA).)


Securities for which ISINs are issued include bonds, commercial paper, equities and warrants.

Ostensibly, ISIN’s apply to items that can be traded on the markets as a security.

The ISIN code is a 12-character alpha-numerical code that does not contain information characterizing financial instruments but serves for uniform identification of a security at trading and settlement.

Securities to which ISINs can be issued include debt securities, shares, options, derivatives and futures.

The ISIN identifies the security, not the exchange (if any) on which it trades; it is not a ticker symbol

For instance, Daimler AG stock trades through almost 30 trading platforms and exchanges worldwide, and is priced in five different currencies; it has the same ISIN on each, though not the same ticker symbol. ISIN cannot specify a particular trading location in this case, and another identifier, typically MIC (Market Identification Code) or the three-letter exchange code, will have to be specified in addition to the ISIN. The Currency of the trade will also be required to uniquely identify the instrument using this method.

Description

An ISIN consists of three parts:

Generally, a two letter country code, a nine character alpha-numeric national security identifier, and a single check digit

The country code is the ISO 3166-1 alpha-2 code for the country of issue, which is not necessarily the country where the issuing company is domiciled.

International securities cleared through Clearstream or Euroclear, which are Europe-wide, use "XS" as the country code.

Issuance

The ISIN is based on the National Securities Identifying Number, or NSIN, assigned by governing bodies in each country, known as the national numbering agency (NNA).
 

The NNAs are co-ordinated through the Association of National Numbering Agences, ANNA.[1]
 

ISIN and CFI information can be accessed through the ANNA Service Bureau,[2] run by Standard and Poor's and SIX Financial Information.

The NSIN element of the ISIN can be up to 9 digits long. Shorter numbers are padded with leading zeros before the addition of the country code and a check digit transform the NSIN to an ISIN.

In North America the NNA is the CUSIP organization, meaning that CUSIPs can easily be converted into ISINs by adding the US or CA country code to the beginning of the existing CUSIP code and adding an additional check digit at the end. 

In the United Kingdom and Ireland the NNA is the London Stock Exchange and the NSIN is the SEDOL, converted in a similar fashion. 

Swiss ISINs are issued by SIX Financial Information and are based on the VALOR number

Most other countries use similar conversions, but if no country NNA exists then regional NNAs are used instead.

ISIN Calculation Methodology

The procedure for calculating ISIN check digits is similar to the "Modulus 10 Double Add Double" technique used in CUSIPs.

To calculate the check digit,

first convert any letters to numbers by adding their ordinal position in the alphabet to 9, such that A = 10 and M = 22.

Starting with the right most digit, every other digit is multiplied by two.

(For CUSIP check digits, these two steps are reversed.)

The resulting string of digits (numbers greater than 9 becoming two separate digits) are added up.

Subtract this sum from the smallest number ending with zero that is greater than or equal to it: this gives the check digit, which is also known as the ten's complement of the sum modulo 10. 

That is, the resulting sum, including the check-digit, is a multiple of 10.

ISINs are slowly being introduced worldwide.
 

At present, trading, clearing and settlement systems in many countries have adopted ISINs as a secondary measure of identifying securities.

Additionally, some of those countries, mainly in Europe, have moved to using ISINs as their primary means of identifying securities.

Conversion table for characters is :

A = 10
F = 15
K = 20
P = 25
U = 30
Z = 35
B = 11
G = 16
L = 21
Q = 26
V = 31

C = 12
H = 17
M = 22
R = 27
W = 32

D = 13
I = 18
N = 23
S = 28
X = 33

E = 14
J = 19
O = 24
T = 29
Y = 34



In other words; Take the ASCII code for the capital letter and subtract 55

C function for validating an ISINCode:

int

isIsinValid(const char *isin)

{

    int d1, d2, sum, multiply, i;



    if (!isin || strlen(isin) != 12 || !isdigit(isin[11]))

        return 0;



    for (sum = 0, multiply = 1, i = 10; i > -1; --i) {

        switch (i) {

        case 0:

        case 1:

            if (isupper(isin[i]))

                d1 = isin[i] - 'A' + 10;

            else

                return 0;

            break;

        default:

            if (isupper(isin[i]))

                d1 = isin[i] - 'A' + 10;

            else if (isdigit(isin[i]))

                d1 = isin[i] - '0';

            else

                return 0;

            break;

        }



        if (d1 < 10) {

            d1 *= (multiply ? 2 : 1);

            multiply = !multiply;

        } else {

            d2 = d1 / 10;

            d1 %= 10;

            d1 *= (multiply ? 2 : 1);

            d2 *= (multiply ? 1 : 2);

            sum += (d2 % 10) + (d2 / 10);

        }

        sum += (d1 % 10) + (d1 / 10);

    }



    sum %= 10;

    sum = 10 - sum;

    sum %= 10;



    if (sum != isin[11] - '0')

        return 0;



    return 1;

}

Fortran function for validating an ISINCode:

*

* Checks whether an ISIN is valid

*



       LOGICAL FUNCTION IS_ISIN(ISIN)

       CHARACTER*13 ISIN



       INTEGER      I

       INTEGER      NEWSUM, OLDSUM

       INTEGER      D1

       INTEGER      D2

       LOGICAL      MULTIPLY

       LOGICAL      IS_DIGIT

       LOGICAL      IS_UPPER



       IF (LEN_TRIM(ISIN) .NE. 12) THEN

           IS_ISIN = .FALSE.

           RETURN

       ENDIF



       IF (IS_DIGIT(ISIN(12:12)) .EQV. .FALSE.) THEN

           IS_ISIN = .FALSE.

           RETURN

       ENDIF



       NEWSUM = 0

       MULTIPLY = .TRUE.



       DO I = 11, 1, -1

           IF (I .EQ. 0 .OR. I .EQ. 1) THEN

               IF (IS_UPPER(ISIN(I:I))) THEN

                   D1 = IACHAR(ISIN(I:I)) - IACHAR('A') + 10

               ELSE

                   IS_ISIN = .FALSE.

                   RETURN

               ENDIF

           ELSE

               IF (IS_UPPER(ISIN(I:I))) THEN

                   D1 = IACHAR(ISIN(I:I)) - IACHAR('A') + 10

               ELSE IF (IS_DIGIT(ISIN(I:I))) THEN

                   D1 = IACHAR(ISIN(I:I)) - IACHAR('0')

               ELSE

                   IS_ISIN = .FALSE.

                   RETURN

               ENDIF

           ENDIF



           IF (D1 .LT. 10) THEN

               IF (MULTIPLY) THEN

                   D1 = D1 * 2

               ENDIF

               MULTIPLY = .NOT. MULTIPLY

           ELSE

               D2 = D1 / 10

               D1 = MOD(D1, 10)

               IF (MULTIPLY) THEN

                   D1 = D1 * 2

               ELSE

                   D2 = D2 * 2

               ENDIF

               NEWSUM = NEWSUM + MOD(D2, 10) + (D2 / 10)

           ENDIF

           NEWSUM = NEWSUM + MOD(D1, 10) + (D1 / 10)

       ENDDO



       NEWSUM = MOD(NEWSUM, 10)

       NEWSUM = 10 - NEWSUM

       NEWSUM = MOD(NEWSUM, 10)



       OLDSUM = IACHAR(ISIN(12:12)) - IACHAR('0')



       IF (OLDSUM .NE. NEWSUM) THEN

           IS_ISIN = .FALSE.

           RETURN

       ENDIF



       IS_ISIN = .TRUE.



       RETURN

       END



*

* Checks whether a character is a digit

*



       LOGICAL FUNCTION IS_DIGIT(C)

       CHARACTER*1  C



       CHARACTER*10 DIGIT

       INTEGER      INDX



       DIGIT = '0123456789'

       INDX = INDEX(DIGIT, C)

       IF (INDX .NE. 0) THEN

           IS_DIGIT = .TRUE.

       ELSE

           IS_DIGIT = .FALSE.

       ENDIF



       RETURN

       END



*

* Checks whether a character is an uppercase letter

*



       LOGICAL FUNCTION IS_UPPER(C)

       CHARACTER*1  C



       CHARACTER*26 UPPER

       INTEGER      INDX



       UPPER = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

       INDX = INDEX(UPPER, C)

       IF (INDX .NE. 0) THEN

           IS_UPPER = .TRUE.

       ELSE

           IS_UPPER = .FALSE.

       ENDIF



       RETURN

       END


Excel VBA Function for validating an ISINCode:

Public Function ISINCODE(ByVal sISINCode As String) As Boolean



   'Jelle-Jeroen Lamkamp 28 Apr 2008

  

   Dim i As Integer: Dim iTotalScore As Integer

   Dim s As String: Dim sDigits As String



   sISINCode = UCase(Trim(sISINCode))



   If Len(sISINCode) <> 12 Then Exit Function



   If MID(sISINCode,1,1) < "A" Or MID(sISINCode,1,1) > "Z" Then Exit Function

   If MID(sISINCode,2,1) < "A" Or MID(sISINCode,2,1) > "Z" Then Exit Function



   sDigits = ""



   For i = 1 To 11

       s = Mid(sISINCode, i, 1)

       If s >= "0" And s <= "9" Then

          sDigits = sDigits & s

       ElseIf s >= "A" And s <= "Z" Then

          sDigits = sDigits & CStr(Asc(s) - 55)

       Else

          Exit Function

       End If

   Next i



   sDigits = StrReverse(sDigits)



   iTotalScore = 0



   For i = 1 To Len(sDigits)

       iTotalScore = iTotalScore + CInt(Mid(sDigits, i, 1))

       If i Mod 2 = 1 Then

          iTotalScore = iTotalScore + CInt(Mid(sDigits, i, 1))

          If CInt(Mid(sDigits, i, 1)) > 4 Then

             iTotalScore = iTotalScore - 9

          End If

       End If

   Next i



   If (10 - (iTotalScore Mod 10)) Mod 10 = CInt(Mid(sISINCode, 12, 1)) Then ISINCODE = True



End Function


TSQL code for validating an ISINCode:

-- ================================================

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

-- =============================================

-- Author:      Pang Chong Peng

-- Create date: 20/7/2010

-- Description: CheckSum for ISIN code

-- =============================================

CREATE FUNCTION [dbo].[fn_IsISINValid] ( @ISINCode  AS  NVARCHAR(20))

RETURNS BIT

AS

BEGIN



        DECLARE @i AS INT;

        DECLARE @iTotalScore AS int;

        DECLARE @s AS INT;

        DECLARE @sDigit AS VARCHAR(22); /* Edit 101004 csouto: Needs to be 22 characters long so it can validate Isin Codes for 'Lotes Padrão' */



        SELECT @ISINCode = UPPER(@ISINCode);



        IF LEN (@ISINCode) != 12

                RETURN 0;



        IF ASCII(SUBSTRING(@ISINCode, 1, 1)) < ASCII('A') OR ASCII(SUBSTRING(@ISINCode, 1, 1)) > ASCII('Z')

                RETURN 0;



        IF ASCII(SUBSTRING(@ISINCode, 2, 1)) < ASCII('A') OR ASCII(SUBSTRING(@ISINCode, 2, 1)) > ASCII('Z')

                RETURN 0;



        IF (ISNUMERIC(SUBSTRING(@ISINCode, 12, 1)) = 0) -- Check that the checksum is numeric

                RETURN 0;      



        SELECT @sDigit = '';



        SELECT @i = 1;

        WHILE (@i <= 11)

        BEGIN

                SELECT @s = ASCII(SUBSTRING(@ISINCode, @i, 1))

                IF @s >= ASCII('0') AND @s <= ASCII('9')

                        SELECT @sDigit = @sDigit + SUBSTRING(@ISINCode, @i, 1);

                ELSE IF @s >= ASCII('A') AND @s <= ASCII('Z')

                        SELECT @sDigit = @sDigit + CONVERT(VARCHAR(2), @s - 55);

                ELSE

                        BREAK;         

                SELECT @i = @i + 1;                            

        END



        SELECT @sDigit = REVERSE(@sDigit);

        SELECT @iTotalScore = 0;

        SELECT @i = 1;



        WHILE (@i <= LEN(@sDigit))

        BEGIN

                SELECT @iTotalScore = @iTotalScore + CONVERT(INT, SUBSTRING(@sDigit, @i, 1))

                 IF @i%2 = 1

                BEGIN

                        SELECT @iTotalScore = @iTotalScore + CONVERT(INT, SUBSTRING(@sDigit, @i, 1))

                        IF  CONVERT(INT, (SUBSTRING(@sDigit, @i, 1))) > 4

                        BEGIN

                                SELECT @iTotalScore = @iTotalScore - 9;

                        END

                END



                SELECT @i = @i + 1;

        END





        IF (10 - (@iTotalScore%10))%10 = CONVERT (INT,(SUBSTRING(@ISINCode, 12, 1)))

                RETURN 1;



        RETURN 0;



END


JavaScript code for validating an ISINCode:

function checkISINCODE(sISINCode){

        var i, iTotalScore, s, sDigits;



        if( sISINCode.length != 12){

                return false;

        }



        if( sISINCode.charCodeAt(0) < "A".charCodeAt(0) ||

                sISINCode.charCodeAt(0) > "Z".charCodeAt(0) ){

                return false;

        }

        if( sISINCode.charCodeAt(1) < "A".charCodeAt(0) ||

                sISINCode.charCodeAt(1) > "Z".charCodeAt(0) ){

                return false;

        }



        sDigits = "";



        for(var i = 0; i < 11; i++){

            sDigits += parseInt(sISINCode.charAt(i), 36);

        }



        var sDigits = sDigits.split("").reverse().join("");



        var iTotalScore = 0;



        for(var i = 0; i< sDigits.length; i++){

            iTotalScore += parseInt(sDigits.charAt(i));

            if (i % 2 == 0){

               iTotalScore += parseInt(sDigits.charAt(i));

               if ( parseInt(sDigits.charAt(i)) > 4 ){

                  iTotalScore -= 9;

               }

            }

        }



        return (10 - (iTotalScore % 10)) % 10 == parseInt(sISINCode.charAt(11));

}


Java code for validating an ISINCode:

  private static final Pattern ISIN_PATTERN = Pattern.compile("[A-Z]{2}([A-Z0-9]){9}[0-9]");



  public static boolean checkIsinCode(final String isin) {

    if (isin == null) {

      return false;

    }



    if (!ISIN_PATTERN.matcher(isin).matches()) {

      return false;

    }



    StringBuilder digits = new StringBuilder();

    for (int i = 0; i < 11; ++i) {

      digits.append(Character.digit(isin.charAt(i), 36));

    }

    digits.reverse();



    int sum = 0;

    for (int i = 0; i < digits.length(); ++i) {

      int digit = Character.digit(digits.charAt(i), 36);

      if (i % 2 == 0) {

        digit *= 2;

      }

      sum += digit / 10;

      sum += digit % 10;

    }



    int checkDigit = Character.digit(isin.charAt(11), 36);

    int tensComplement = (sum % 10 == 0) ? 0 : ((sum / 10) + 1) * 10 - sum;

    return checkDigit == tensComplement;

  }


C# Code for validating an ISINCode:

using System;

using System.Text.RegularExpressions;



namespace ISIN

{

    public static class ISINChecker

    {

        public static bool CheckIsinCode(string isin)

        {

            Regex ISIN_PATTERN = new Regex(@"[A-Z]{2}([A-Z0-9]){9}[0-9]");

            if (isin == null)

            {

                return false;

            }

            if (!ISIN_PATTERN.IsMatch(isin))

            {

                return false;

            }



            int[] digits = new int[22];

            int index = 0;

            for (int i = 0; i < 11; i++)

            {

                char c = isin[i];

                if (c >= '0' && c <= '9')

                {

                    digits[index++] = c - '0';

                }

                else if (c >= 'A' && c <= 'Z')

                {

                    int n = c - 'A' + 10;

                    int tens = n / 10;

                    if (tens != 0)

                    {

                        digits[index++] = tens;

                    }

                    digits[index++] = n % 10;

                }

                else

                {

                    // Not a digit or upper-case letter.

                    return false;

                }

            }

            int sum = 0;

            for (int i = 0; i < index; i++)

            {

                int digit = digits[index - 1 - i];

                if (i % 2 == 0)

                {

                    digit *= 2;

                }

                sum += digit / 10;

                sum += digit % 10;

            }



            int checkDigit = isin[11] - '0';

            int tensComplement = (sum % 10 == 0) ? 0 : ((sum / 10) + 1) * 10 - sum;

            return checkDigit == tensComplement;

        }

    }

}


Python code for validating ISIN codes

import re



def checkISIN(value):

    value = value.strip().upper()

    m = re.match('^([A-Z][A-Z])([A-Z0-9]{9}\d)$', value)

    if not m:

        return False

    sum_digits_str = ''.join(str(int(c, 36)) for c in value[:11])

    total_sum = 0

    parity = len(sum_digits_str) % 2

    for n, c in enumerate(sum_digits_str):

        a = int(c)

        if n % 2 != parity:

            a = a * 2

        total_sum += a / 10

        total_sum += a % 10

    check_digit = (10 - (total_sum % 10)) % 10

    return value[11] == unicode(check_digit)



if __name__ == "__main__":

    for i in [

        'US0378331005',

        'AU0000XVGZA3',

        'GB0002634946']:

        print i, checkISIN(i)


SAS code for validating ISIN codes

/* Aitor Olasagasti Alonso 2011-04-19 */

/* SAS 8.2 and SAS 9.X compatible */

data trueIsin;

    set isinTable;

    length allCode $24;

    ilegal = 0;

    if length(isin) ^= 12 then delete;

    lastNum = substr(isin, 12, 1);

    code = rank(lastNum);

    if not (code >= 48 and code =< 57) then delete;

    do i = 1 to 11;

        code = rank(substr(isin, i, 1));

        if code <48 or (code > 57 and code < 65) or code > 90 then ilegal = 1;

        if (i = 1 or i = 2) and (code < 65 or code > 90) then ilegal = 1;

        if code >= 65 and code =< 90 then do;

            code = code-55;

            allCode = compress(allCode) || compress(put(code, best.));

        end;

        else do;

            allCode = compress(allCode) || substr(isin, i, 1);

        end;   

    end;

    if ilegal then delete;

    suma = 0;

    rAllCode =  reverse(trim(allCode));

    rlength = length(rAllCode);

    do i = 1 to rlength;

        numb = input(substr(rAllCode, i, 1), best.);

        if mod(i, 2) then do;

            numb = numb * 2;

            if numb / 10 >= 1 then do;

                suma = suma + mod(numb, 10) + 1;

            end;

            else do;

                suma = suma + (numb);

            end;

        end;

        else do;

            suma = suma + numb;

        end;

    end;

    modSum = mod(suma, 10);

    total = mod(10 - modSum, 10);

    if total ^= input(lastNum, best.) then delete;

run;


PHP Code for validating an ISINCode:

function isIsin($isin) {

        if (strlen(trim($isin))) {

                $cle = substr($isin, -1);

                $isinLeft = substr($isin, 0, strlen($isin)-1);

                $letter2number = array('A'=>10, 'B'=>11, 'C'=>12, 'D'=>13, 'E'=>14, 'F'=>15, 'G'=>16, 'H'=>17, 'I'=>18, 'J'=>19, 'K'=>20, 'L'=>21, 'M'=>22, 'N'=>23, 'O'=>24, 'P'=>25, 'Q'=>26, 'R'=>27, 'S'=>28, 'T'=>29, 'U'=>30, 'V'=>31, 'W'=>32, 'X'=>33, 'Y'=>34, 'Z'=>35);

                $isinConvertion = strtr($isinLeft, $letter2number);

                $sum = '';

                $sumFinal = 0;

                $offset = (strlen($isinConvertion) + 1) % 2;

                $isinConvertionLen = strlen($isinConvertion);

                for($i=0; $i < $isinConvertionLen; ++$i) $sum .= ((($i + $offset) % 2) ? 1 : 2) * $isinConvertion[$i];

                $sumLen = strlen($sum);

                for($i=0; $i < $sumLen; ++$i) $sumFinal += $sum[$i];

                if ($sumFinal % 10){

                        $cleVerif = ((int)($sumFinal/10) + 1) * 10 - $sumFinal;

                } else {

                        $cleVerif = 0;

                }

                if ($cle == $cleVerif) {

                        return true;

                } else {

                        return false;

                }

        } else {

                return false;

        }

}


UNIX shell script for validating a list of ISIN Codes:

#!/bin/bash



# GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)

#

# created by: Erik Klamer

# date:       26/06/2012

# usage:      save code in script and run with argument

#             pointing to file containing list of ISIN codes



cat $1|while read ISIN ; do

  [[ "${ISIN}" =~ [A-Z]{2}[A-Z0-9]{10} ]] || continue

  unset CALC

  unset REVCALC

  SUM=0

  for  i in {0..10} ; do

    CHAR=${ISIN:$i:1}

    [[ "${CHAR}" =~ [A-Z] ]] && VALUE=$(expr $(printf "%d\n" "'${CHAR}") - 55)

    [[ "${CHAR}" =~ [0-9] ]] && VALUE=${CHAR}

    CALC=${CALC}${VALUE}

  done

  REVCALC=$(echo ${CALC}|rev)

  for (( i = 0; i < ${#REVCALC}; i++ )) ; do

    if [[ $i%2 -eq 0 ]] ; then

      MCHAR=$(expr ${REVCALC:$i:1} \* 2)

      [[ ${#MCHAR} -eq 2 ]] && MCHAR=$(expr ${MCHAR:0:1} + ${MCHAR:1:1})

    else

      MCHAR=${REVCALC:$i:1}

    fi

    SUM=$(expr ${SUM} +  ${MCHAR})

  done

  MOD=$(expr 10 - ${SUM:${#SUM}-1:1})

  [[ ${MOD} -eq 10 ]] && MOD=0

  [[ $(expr ${MOD} - ${ISIN:${#ISIN}-1:1}) -eq 0 ]]  && echo ${ISIN}

done


Examples


Apple Inc.


Apple Inc.: ISIN US0378331005, expanded from CUSIP 037833100


The main body of the ISIN is the original CUSIP, assigned in the 1970s.


The country code "US" has been added on the front, and an additional check digit at the end.


The country code indicates the country of issue. The check digit is calculated in this way...


Convert any letters to numbers:

U = 30, S = 28. US037833100 -> 3028037833100.


Collect odd and even characters:

3028037833100 = (3, 2, 0, 7, 3, 1, 0), (0, 8, 3, 8, 3, 0)


Multiply the group containing the rightmost character (which is the FIRST group) by 2:


(6, 4, 0, 14, 6, 2, 0)


Add up the individual digits:


(6 + 4 + 0 + (1 + 4) + 6 + 2 + 0) + (0 + 8 + 3 + 8 + 3 + 0) = 45


Take the 10s modulus of the sum:


45 mod 10 = 5

Subtract from 10:

10 - 5 = 5


Take the 10s modulus of the result (this final step is important in the instance where the modulus of the sum is 0, as the resulting check digit would be 10).


5 mod 10 = 5

So the ISIN check digit is five.


Treasury Corporation of Victoria


TREASURY CORP VICTORIA 5 3/4% 2005-2016: ISIN AU0000XVGZA3


Convert any letters to numbers:

A = 10, G = 16, U = 30, V = 31, X = 33, Z = 35. AU0000XVGZA -> 103000003331163510.


Collect odd and even characters:

103000003331163510 = (1, 3, 0, 0, 3, 3, 1, 3, 1), (0, 0, 0, 0, 3, 1, 6, 5, 0)


Multiply the group containing the rightmost character (which is the SECOND group) by 2:

(0, 0, 0, 0, 6, 2, 12, 10, 0)


Add up the individual digits:

(1 + 3 + 0 + 0 + 3 + 3 + 1 + 3 + 1) + (0 + 0 + 0 + 0 + 6 + 2 + (1 + 2) + (1 + 0) + 0) = 27


Take the 10s modulus of the sum:


27 mod 10 = 7


Subtract from 10:


10 - 7 = 3


Take the 10s modulus of the result (this final step is important in the instance where the modulus of the sum is 0, as the resulting check digit would be 10).


3 mod 10 = 3


So the ISIN check digit is three.


BAE Systems


BAE Systems: ISIN GB0002634946, expanded from SEDOL 0263494


The main body is the SEDOL, padded on the front with the addition of two zeros. 

The country code "GB" is then added on the front, and the check digit on the end as in the example above.


References

  1. ^ http://www.anna-web.com
  2. ^ http://www.annaservice.com

http://en.wikipedia.org/wiki/International_Securities_Identification_Number

No comments:

Post a Comment