<?xml version="1.0" encoding="UTF-8"?>
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
  <id>tag:refactormycode.com,2007:users341</id>
  <link type="application/atom+xml" href="http://refactormycode.com/users/341" rel="self"/>
  <title>Alessandro Petrozzelli</title>
  <updated>Wed Nov 07 13:38:08 +0000 2007</updated>
  <entry>
    <id>tag:refactormycode.com,2007:Code142</id>
    <published>2007-11-07T13:38:08+00:00</published>
    <updated>2007-11-12T23:42:15+00:00</updated>
    <title>[Java] ISIN check digit</title>
    <content type="html">&lt;p&gt;based on &lt;a href="http://en.wikipedia.org/wiki/International_Securities_Identifying_Number" target="_blank"&gt;http://en.wikipedia.org/wiki/International_Securities_Identifying_Number&lt;/a&gt;&lt;/p&gt;

&lt;pre&gt;package net.alessandropetrozzelli;

class InvalidISINCharacterException
    extends Exception {
  InvalidISINCharacterException() {
    super();
  }

  InvalidISINCharacterException(String s) {
    super(s);
  }
}

public class Isin {
  static final int numberTableOffset = '0';
  static final int numberTableEndOffset = '9';
  static final int charTableOffset = 'A';
  static final int charTableEndOffset = 'Z';

  private static int getIntValueForISINChar(final char c) throws
      InvalidISINCharacterException {
    int value = 0;

    if ( (c &amp;gt;= numberTableOffset) &amp;amp;&amp;amp; (c &amp;lt;= numberTableEndOffset)) {
      value = c - numberTableOffset;
    }
    else if ( (c &amp;gt;= charTableOffset) &amp;amp;&amp;amp; (c &amp;lt;= charTableEndOffset)) {
      value = 10 + (c - charTableOffset);
    }
    else {
      throw new InvalidISINCharacterException(&amp;quot;Unsupported character: &amp;quot; + c);
    }

    return value;
  }

  private static int getSumOfDigits(final int number) {
    int sumOfDigits=0;
    if (number&amp;lt;=9) {
      sumOfDigits = number;
    } else {
      String s = String.valueOf(number);
      try {
        for (int i = 0; i &amp;lt; s.length(); i++) {
          sumOfDigits += getIntValueForISINChar(s.charAt(i));
        }
      }
      catch (InvalidISINCharacterException ex) {
        System.out.println(ex);
        return -1;
      }
    }
    return sumOfDigits;
  }

  public static int getCheckDigit(final String isin) {
    int checkDigit = 0;

    if ( (isin == null) || (isin.length() != 11)) {
      return -1;
    }
    String incompleteISINcode = isin.toUpperCase();
    StringBuffer buffer = new StringBuffer();

    // convert every single character into number as specified
    try {
      for (int i = 0; i &amp;lt; incompleteISINcode.length(); i++) {
        buffer.append(getIntValueForISINChar(isin.charAt(i)));
      }
    }
    catch (InvalidISINCharacterException ex) {
      System.out.println(ex);
      return -1;
    }

    // sum all digits (multiplying odd digits by 2)
    try {
      for (int i = buffer.length() - 1; i &amp;gt;= 0; i--) {
        if ( (buffer.length() - i) % 2 == 1) {
          checkDigit += getSumOfDigits(getIntValueForISINChar(buffer.charAt(i)) * 2);
        }
        else {
          checkDigit += getIntValueForISINChar(buffer.charAt(i));
        }
      }
    }
    catch (InvalidISINCharacterException ex) {
      // this should never happen
      System.out.println(ex);
      return -1;
    }

    // end result
    checkDigit = (10 - (checkDigit % 10)) % 10;
    return checkDigit;
  }
&lt;/pre&gt;</content>
    <author>
      <name>Alessandro Petrozzelli</name>
      <email>a_petrozzelli@hotmail.com</email>
    </author>
    <link type="text/html" href="http://refactormycode.com/codes/142-isin-check-digit" rel="alternate"/>
  </entry>
</feed>
