Data update
This commit is contained in:
parent
5150844a7d
commit
4bb20c9b71
7735 changed files with 38060 additions and 199180 deletions
|
|
@ -1,74 +0,0 @@
|
|||
procedure ISIN is
|
||||
-- Luhn_Test copied from other Task
|
||||
function Luhn_Test (Number: String) return Boolean is
|
||||
Sum : Natural := 0;
|
||||
Odd : Boolean := True;
|
||||
Digit: Natural range 0 .. 9;
|
||||
begin
|
||||
for p in reverse Number'Range loop
|
||||
Digit := Integer'Value (Number (p..p));
|
||||
if Odd then
|
||||
Sum := Sum + Digit;
|
||||
else
|
||||
Sum := Sum + (Digit*2 mod 10) + (Digit / 5);
|
||||
end if;
|
||||
Odd := not Odd;
|
||||
end loop;
|
||||
return (Sum mod 10) = 0;
|
||||
end Luhn_Test;
|
||||
|
||||
subtype Decimal is Character range '0' .. '9';
|
||||
subtype Letter is Character range 'A' .. 'Z';
|
||||
subtype ISIN_Type is String(1..12);
|
||||
|
||||
-- converts a string of decimals and letters into a string of decimals
|
||||
function To_Digits(S: String) return String is
|
||||
-- Character'Pos('A')-Offset=10, Character'Pos('B')-Offset=11, ...
|
||||
Offset: constant Integer := Character'Pos('A')-10;
|
||||
|
||||
Invalid_Character: exception;
|
||||
begin
|
||||
if S = "" then
|
||||
return "";
|
||||
elsif S(S'First) = ' ' then -- skip blanks
|
||||
return To_Digits(S(S'First+1 .. S'Last));
|
||||
elsif S(S'First) in Decimal then
|
||||
return S(S'First) & To_Digits(S(S'First+1 .. S'Last));
|
||||
elsif S(S'First) in Letter then
|
||||
return To_Digits(Integer'Image(Character'Pos(S(S'First))-Offset))
|
||||
& To_Digits(S(S'First+1 .. S'Last));
|
||||
else
|
||||
raise Invalid_Character;
|
||||
end if;
|
||||
end To_Digits;
|
||||
|
||||
function Is_Valid_ISIN(S: ISIN_Type) return Boolean is
|
||||
Number : String := To_Digits(S);
|
||||
begin
|
||||
return S(S'First) in Letter and
|
||||
S(S'First+1) in Letter and
|
||||
S(S'Last) in Decimal and
|
||||
Luhn_Test(Number);
|
||||
end Is_Valid_ISIN;
|
||||
|
||||
Test_Cases : constant Array(1..6) of ISIN_Type :=
|
||||
("US0378331005",
|
||||
"US0373831005",
|
||||
"U50378331005",
|
||||
-- excluded by type with fixed length
|
||||
-- "US03378331005",
|
||||
"AU0000XVGZA3",
|
||||
"AU0000VXGZA3",
|
||||
"FR0000988040");
|
||||
begin
|
||||
for I in Test_Cases'Range loop
|
||||
Ada.Text_IO.Put_Line(Test_Cases(I) & ":" &
|
||||
Boolean'Image(Is_Valid_ISIN(Test_Cases(I))));
|
||||
end loop;
|
||||
-- using wrong length will result in an exception:
|
||||
Ada.Text_IO.Put("US03378331005:");
|
||||
Ada.Text_IO.Put_Line(Boolean'Image(Is_Valid_Isin("US03378331005")));
|
||||
exception
|
||||
when others =>
|
||||
Ada.Text_IO.Put_Line("Exception occured");
|
||||
end ISIN;
|
||||
|
|
@ -1,173 +0,0 @@
|
|||
>>SOURCE FORMAT FREE
|
||||
*> this is gnucobol 2.0
|
||||
identification division.
|
||||
program-id. callISINtest.
|
||||
data division.
|
||||
working-storage section.
|
||||
01 ISINtest-result binary-int.
|
||||
procedure division.
|
||||
start-callISINtest.
|
||||
display 'should be valid ' with no advancing
|
||||
call 'ISINtest' using 'US0378331005' ISINtest-result
|
||||
perform display-ISINtest-result
|
||||
display 'should not be valid ' with no advancing
|
||||
call 'ISINtest' using 'US0373831005' ISINtest-result
|
||||
perform display-ISINtest-result
|
||||
display 'should not be valid ' with no advancing
|
||||
call 'ISINtest' using 'U50378331005' ISINtest-result
|
||||
perform display-ISINtest-result
|
||||
display 'should not be valid ' with no advancing
|
||||
call 'ISINtest' using 'US03378331005' ISINtest-result
|
||||
perform display-ISINtest-result
|
||||
display 'should be valid ' with no advancing
|
||||
call 'ISINtest' using 'AU0000XVGZA3' ISINtest-result
|
||||
perform display-ISINtest-result
|
||||
display 'should be valid ' with no advancing
|
||||
call 'ISINtest' using 'AU0000VXGZA3' ISINtest-result
|
||||
perform display-ISINtest-result
|
||||
display 'should be valid ' with no advancing
|
||||
call 'ISINtest' using 'FR0000988040' ISINtest-result
|
||||
perform display-ISINtest-result
|
||||
stop run
|
||||
.
|
||||
display-ISINtest-result.
|
||||
evaluate ISINtest-result
|
||||
when 0
|
||||
display ' is valid'
|
||||
when -1
|
||||
display ' invalid length '
|
||||
when -2
|
||||
display ' invalid countrycode '
|
||||
when -3
|
||||
display ' invalid base36 digit '
|
||||
when -4
|
||||
display ' luhn test failed'
|
||||
when other
|
||||
display ' invalid return code ' ISINtest-result
|
||||
end-evaluate
|
||||
.
|
||||
end program callISINtest.
|
||||
|
||||
identification division.
|
||||
program-id. ISINtest.
|
||||
data division.
|
||||
working-storage section.
|
||||
01 country-code-values value
|
||||
'ADAEAFAGAIALAMAOAQARASATAUAWAXAZBABBBDBEBFBGBHBIBJBLBMBNBOBQBRBS'
|
||||
& 'BTBVBWBYBZCACCCDCFCGCHCICKCLCMCNCOCRCUCVCWCXCYCZDEDJDKDMDODZECEE'
|
||||
& 'EGEHERESETFIFJFKFMFOFRGAGBGDGEGFGGGHGIGLGMGNGPGQGRGSGTGUGWGYHKHM'
|
||||
& 'HNHRHTHUIDIEILIMINIOIQIRISITJEJMJOJPKEKGKHKIKMKNKPKRKWKYKZLALBLC'
|
||||
& 'LILKLRLSLTLULVLYMAMCMDMEMFMGMHMKMLMMMNMOMPMQMRMSMTMUMVMWMXMYMZNA'
|
||||
& 'NCNENFNGNINLNONPNRNUNZOMPAPEPFPGPHPKPLPMPNPRPSPTPWPYQARERORSRURW'
|
||||
& 'SASBSCSDSESGSHSISJSKSLSMSNSOSRSSSTSVSXSYSZTCTDTFTGTHTJTKTLTMTNTO'
|
||||
& 'TRTTTVTWTZUAUGUMUSUYUZVAVCVEVGVIVNVUWFWSYEYTZAZMZW'.
|
||||
03 country-codes occurs 249
|
||||
ascending key country-code
|
||||
indexed by cc-idx.
|
||||
05 country-code pic xx.
|
||||
|
||||
01 b pic 99.
|
||||
01 base36-digits pic x(36) value
|
||||
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'.
|
||||
|
||||
01 i pic 99.
|
||||
01 p pic 99.
|
||||
01 luhn-number pic x(20).
|
||||
01 luhntest-result binary-int.
|
||||
|
||||
linkage section.
|
||||
01 test-number any length.
|
||||
01 ISINtest-result binary-int.
|
||||
|
||||
procedure division using test-number ISINtest-result.
|
||||
start-ISINtest.
|
||||
display space test-number with no advancing
|
||||
|
||||
*> format test
|
||||
if function length(test-number) <> 12
|
||||
move -1 to ISINtest-result
|
||||
goback
|
||||
end-if
|
||||
|
||||
*> countrycode test
|
||||
search all country-codes
|
||||
at end
|
||||
move -2 to ISINtest-result
|
||||
goback
|
||||
when test-number(1:2) = country-code(cc-idx)
|
||||
continue
|
||||
end-search
|
||||
|
||||
*> convert each character from base 36 to base 10
|
||||
*> and add to the luhn-number
|
||||
move 0 to p
|
||||
perform varying i from 1 by 1 until i > 12
|
||||
if test-number(i:1) >= '0' and <= '9'
|
||||
move test-number(i:1) to luhn-number(p + 1:1)
|
||||
add 1 to p
|
||||
else
|
||||
perform varying b from 9 by 1 until b > 35
|
||||
or base36-digits(b + 1:1) = test-number(i:1)
|
||||
continue
|
||||
end-perform
|
||||
if b > 35
|
||||
move -3 to ISINtest-result
|
||||
goback
|
||||
end-if
|
||||
move b to luhn-number(p + 1:2)
|
||||
add 2 to p
|
||||
end-if
|
||||
end-perform
|
||||
|
||||
call 'luhntest' using luhn-number(1:p) luhntest-result
|
||||
if luhntest-result <> 0
|
||||
move -4 to ISINtest-result
|
||||
goback
|
||||
end-if
|
||||
|
||||
move 0 to ISINtest-result
|
||||
goback
|
||||
.
|
||||
end program ISINtest.
|
||||
|
||||
identification division.
|
||||
program-id. luhntest.
|
||||
data division.
|
||||
working-storage section.
|
||||
01 i pic S99.
|
||||
01 check-sum pic 999.
|
||||
linkage section.
|
||||
01 test-number any length.
|
||||
01 luhntest-result binary-int.
|
||||
procedure division using test-number luhntest-result.
|
||||
start-luhntest.
|
||||
display space test-number with no advancing
|
||||
move 0 to check-sum
|
||||
|
||||
*> right to left sum the odd numbered digits
|
||||
compute i = function length(test-number)
|
||||
perform varying i from i by -2 until i < 1
|
||||
add function numval(test-number(i:1)) to check-sum
|
||||
end-perform
|
||||
display space check-sum with no advancing
|
||||
|
||||
*> right to left double sum the even numbered digits
|
||||
compute i = function length(test-number) - 1
|
||||
perform varying i from i by -2 until i < 1
|
||||
add function numval(test-number(i:1)) to check-sum
|
||||
add function numval(test-number(i:1)) to check-sum
|
||||
*> convert a two-digit double sum number to a single digit
|
||||
if test-number(i:1) >= '5'
|
||||
subtract 9 from check-sum
|
||||
end-if
|
||||
end-perform
|
||||
display space check-sum with no advancing
|
||||
|
||||
if function mod(check-sum,10) = 0
|
||||
move 0 to luhntest-result *> success
|
||||
else
|
||||
move -1 to luhntest-result *> failure
|
||||
end-if
|
||||
goback
|
||||
.
|
||||
end program luhntest.
|
||||
|
|
@ -1,5 +1,7 @@
|
|||
//
|
||||
// Validate International Securities Identification Number
|
||||
// Using FutureBasic 7.0.33, December 2024 R.W.
|
||||
//
|
||||
// At entry ISIN string
|
||||
// Exits with Boolean Valid or Invalid
|
||||
//
|
||||
|
|
|
|||
|
|
@ -1,63 +0,0 @@
|
|||
function Test-ISIN
|
||||
{
|
||||
[CmdletBinding()]
|
||||
[OutputType([bool])]
|
||||
Param
|
||||
(
|
||||
[Parameter(Mandatory=$true, Position=0)]
|
||||
[ValidatePattern("[A-Z]{2}\w{9}\d")]
|
||||
[ValidateScript({$_.Length -eq 12})]
|
||||
[string]
|
||||
$Number
|
||||
)
|
||||
|
||||
function Split-Array
|
||||
{
|
||||
$array = @(), @()
|
||||
$input | ForEach-Object {$array[($index = -not $index)] += $_}
|
||||
$array[1], $array[0]
|
||||
}
|
||||
|
||||
filter ConvertTo-Digit
|
||||
{
|
||||
if ($_ -gt 9)
|
||||
{
|
||||
$_.ToString().ToCharArray() | ForEach-Object -Begin {$n = 0} -Process {$n += [Char]::GetNumericValue($_)} -End {$n}
|
||||
}
|
||||
else
|
||||
{
|
||||
$_
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$checkDigit = $Number[-1]
|
||||
|
||||
$digits = ($Number -replace ".$").ToCharArray() | ForEach-Object {
|
||||
if ([Char]::IsDigit($_))
|
||||
{
|
||||
[Char]::GetNumericValue($_)
|
||||
}
|
||||
else
|
||||
{
|
||||
[int][char]$_ - 55
|
||||
}
|
||||
}
|
||||
|
||||
$odds, $evens = ($digits -join "").ToCharArray() | Split-Array
|
||||
|
||||
if ($odds.Count -gt $evens.Count)
|
||||
{
|
||||
$odds = $odds | ForEach-Object {[Char]::GetNumericValue($_) * 2} | ConvertTo-Digit
|
||||
$evens = $evens | ForEach-Object {[Char]::GetNumericValue($_)}
|
||||
}
|
||||
else
|
||||
{
|
||||
$odds = $odds | ForEach-Object {[Char]::GetNumericValue($_)}
|
||||
$evens = $evens | ForEach-Object {[Char]::GetNumericValue($_) * 2} | ConvertTo-Digit
|
||||
}
|
||||
|
||||
$sum = ($odds | Measure-Object -Sum).Sum + ($evens | Measure-Object -Sum).Sum
|
||||
|
||||
(10 - ($sum % 10)) % 10 -match $checkDigit
|
||||
}
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
"US0378331005","US0373831005","US0337833103","AU0000XVGZA3","AU0000VXGZA3","FR0000988040" | ForEach-Object {
|
||||
[PSCustomObject]@{
|
||||
ISIN = $_
|
||||
IsValid = Test-ISIN -Number $_
|
||||
}
|
||||
}
|
||||
|
|
@ -1,8 +1,8 @@
|
|||
Base ← "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||
Luhn ← =0◿10+⊃(/+⊢|/+∵(⍥(-9)>9.×2)⊡1)⍉⬚0↯∞_2⇌
|
||||
Checksum ← Luhn≡⋕/◇⊂≡(□°⋕⊗)⊙(¤Base)
|
||||
Format ← ××⊃(/×≡(≥@A)↙2|=12⧻|/↧∊:Base)
|
||||
Valid ← ×⊃(Format|Checksum)
|
||||
Base ← "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||||
Luhn ← =0◿10+⊃(/+⊢|/+≡₀(⍥(-9)>9.×2)⊡1)⍉⬚0↯∞_2⇌
|
||||
Checksum ← Luhn≡⋕/◇⊂≡(□°⋕˜⨂)⊙(¤Base)
|
||||
Format ← ××⊃(/×≡(≥@A)↙2|=12⧻|/↧˜∊:Base)
|
||||
Valid ← ×⊃(Format|Checksum)
|
||||
|
||||
Tests ← {
|
||||
"AU0000XVGZA3"
|
||||
|
|
|
|||
|
|
@ -1,47 +0,0 @@
|
|||
' Validate International Securities Identification Number - 03/03/2019
|
||||
|
||||
buf=buf&test("US0378331005")&vbCrLf
|
||||
buf=buf&test("US0373831005")&vbCrLf
|
||||
buf=buf&test("U50378331005")&vbCrLf
|
||||
buf=buf&test("US03378331005")&vbCrLf
|
||||
buf=buf&test("AU0000XVGZA3")&vbCrLf
|
||||
buf=buf&test("AU0000VXGZA3")&vbCrLf
|
||||
buf=buf&test("FR0000988040")&vbCrLf
|
||||
msgbox buf,,"Validate International Securities Identification Number"
|
||||
|
||||
function test(cc)
|
||||
dim err,c,r,s,i1,i2
|
||||
if len(cc)=12 then
|
||||
for i=1 to len(cc)
|
||||
p=instr("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",mid(cc,i,1))
|
||||
if p<>0 then c=c&(p-1) else err=1
|
||||
next 'i
|
||||
for i=1 to 2
|
||||
if instr("ABCDEFGHIJKLMNOPQRSTUVWXYZ",mid(cc,i,1))=0 then err=1
|
||||
next 'i
|
||||
if err=0 then
|
||||
for i=len(c) to 1 step -1
|
||||
r=r&mid(c,i,1)
|
||||
next 'i
|
||||
for i=1 to len(r) step 2
|
||||
i1=i1+cint(mid(r,i,1))
|
||||
next 'i
|
||||
for i=2 to len(r) step 2
|
||||
ii=cint(mid(r,i,1))*2
|
||||
if ii>=10 then ii=ii-9
|
||||
i2=i2+ii
|
||||
next 'i
|
||||
s=cstr(i1+i2)
|
||||
if mid(s,len(s),1)="0" then
|
||||
msg="valid"
|
||||
else
|
||||
msg="invalid ??1"
|
||||
end if
|
||||
else
|
||||
msg="invalid ??2"
|
||||
end if
|
||||
else
|
||||
msg="invalid ??3"
|
||||
end if
|
||||
test=cc&" "&msg
|
||||
end function 'test
|
||||
Loading…
Add table
Add a link
Reference in a new issue