Jump to content

Validate International Securities Identification Number: Difference between revisions

→‎{{header|REXX}}: improved and made ooRexx compatible
(→‎{{header|REXX}}: improved and made ooRexx compatible)
Line 2,702:
 
=={{header|REXX}}==
<syntaxhighlight lang="rexx"></*REXX program validates the checksum digit for an International Securities ID number.*/syntaxhighlight>
parse/*REXX argprogram zvalidates International Securities ID numbers. /*obtain optional ISINs from the C.L.*/
exitParse Arg z /*obtain ISINs from the C.L. /*stick a fork in it, we're all done. */
if z='' then z= "US0378331005 US0373831005 U50378331005 US03378331005 AU0000XVGZA3" ,
If z='' Then 'AU0000VXGZA3 FR0000988040' /* [?] use the default list of ISINs. */
if z='' then z= "US0378331005 US0373831005 U50378331005 US03378331005 AU0000XVGZA3" ',
/* [↓] process all specified ISINs.*/
'US037*331005',
do n=1 for words(z); x=word(z, n); y= x /*obtain an ISIN from the Z list. */
'XY037833100Z AU0000XVGZA3 AU0000VXGZA3 FR0000988040'
$= /* [↓] construct list of ISIN digits. */
valid='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' /*X must contain 0-->9 A-->Z */
do k=1 for length(x); _= substr(x,k,1) /*the ISIN may contain alphabetic chars*/
Do n=1 To words(z) /* [?] process all specified ISINs.*/
p= pos(_, 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ) /*X must contain A──►Z, 0──►9.*/
x=word(z,n) if p==0 then y= /*obtain an ISIN from the Z list. /*trigger "not" valid below.*/
p=verify(x,valid,'N')
else $= $ || p-1 /*convert X string (base 36 ──► dec).*/
If p>0 Then msg='invalid character in position' p':' substr(x,p,1)
end /*k*/ /* [↑] convert alphabetic ──► digits.*/
Else Do
@= /*placeholder for the "not" in message.*/
dd='' if length(y)\==12 then @= "not" /*see if[?] the ISINconstruct islist exactlyof 12ISIN charsdigits. */
Do k=1 To length(x)
if \datatype( left(x,2),'U') then @= "not" /* " " " " 1st 2 chars cap. let.*/
if \datatype(right_=substr(x,k,1),'W') then @= "not" /* " " " " last char not a digit /*the ISIN may contain alphabetic chars*/
if @ p==''pos(_,valid) then if \luhn($) then @= "not" /*X contains 0-->9 A-->Z " " " " passed the Luhn test.*/
say right(x,dd=dd||p-1 30) right(@, 5) "valid" /*display the yea or nay message /*convert X string (base 36 --? dec).*/
End
end /*n*/ /* [↑] 1st 3 IFs could've been combined*/
msg=''
exit /*stick a fork in it, we're all done. */
Select
/*──────────────────────────────────────────────────────────────────────────────────────*/
When length(x)\==12 Then msg='not exactly 12 chars'
Luhn: procedure; parse arg x; $= 0 /*get credit card number; zero $ sum. */
y=When reverse\datatype( left(0x, length(x) // 2)x,'U') Then msg='not starting with 2 /*add leading zero if needed, &capital reverse*/chars'
When \datatype(right(x,1),'W') Then msg='last character is not a digit'
do j=1 to length(y)-1 by 2; _= 2 * substr(y, j+1, 1)
Otherwise
$= $ + substr(y, j, 1) + left(_, 1) + substr(_, 2 , 1, 0)
If \luhn(dd) Then msg='does endnot /*j*/ /* [↑] sumpass the Luhn odd and even digits.*/test'
End
return right($, 1)==0 /*return "1" if number passed Luhn test*/</syntaxhighlight>
End
If msg='' Then
Say right(x,15) ' valid' /* display the positive message. */
Else
Say right(x,15) 'not valid:' msg /* display the problem */
End /*n*/
Exit $= /*stick a fork in it, /* [↓] constructwe're listall ofdone ISIN digits. */
/*-----------------------------------------------------------------------------------*/
luhn: Procedure
Parse Arg x @= /* get credit card number; /*placeholder for the "not" in message.*/
dsum=0 end /*n*/ /* [↑]zero digit sum. 1st 3 IFs could've been combined*/
y=reverse(left(0,length(x)//2)x) /* add leading zero If needed & reverse */
Do j=1 To length(y)-1 By 2
_=2*substr(y,j+1,1)
$dsum= $ dsum+ substr(y, j, 1) + left(_, 1) + substr(_, 2 , 1, 0)
End
returnReturn right($dsum, 1)==0 /*return "Return 1" if number passed Luhn test */</syntaxhighlight>
{{out|output|text=&nbsp; when using the default inputs:}}
<pre>
US0378331005 valid
US0373831005 not valid: does not pass the Luhn test
US0373831005 not valid
U50378331005 not valid: not starting with 2 capital chars
U50378331005 not valid
US03378331005 not valid: not exactly 12 chars
US03378331005 not valid
US037*331005 not valid: invalid character in position 6: *
AU0000XVGZA3 valid
XY037833100Z not valid: last character is not a digit
AU0000VXGZA3 valid
FR0000988040 AU0000XVGZA3 valid
AU0000VXGZA3 valid
FR0000988040 valid
</pre>
 
2,295

edits

Cookies help us deliver our services. By using our services, you agree to our use of cookies.