Ruby
The isin parameter should be the ISIN without the check digit.
# jonelf¤gmail.com 2009-10-14
def calc_ISIN_checksum(isin)
raise isin + " should be 11 characters" if isin.length!=11
sum=0
isin.split(//).map
\
{|c| c[0]>64
? (c[0]-55).to_s.split(//).map
{|d| d.to_i} : c.to_i
} \
.flatten.each_with_index \
{|o,i| sum+= i%2!=0 ? (o*2).modulo(9)+(o/9)*9 : o}
return (10-sum%10)%10
end
>> calc_ISIN_checksum("US38259P508")
=> 3