93 lines
3.2 KiB
Plaintext
93 lines
3.2 KiB
Plaintext
EnableExplicit
|
|
Enumeration IBAN
|
|
#IBAN_VAL
|
|
#IBAN_SUM
|
|
#IBAN_NOSPACE
|
|
#IBAN_VAL_FORM
|
|
#IBAN_SUM_FORM
|
|
EndEnumeration
|
|
|
|
NewMap CData.i()
|
|
Macro CCD(SIGN,LENGTH)
|
|
CData(SIGN)=LENGTH
|
|
EndMacro
|
|
|
|
Procedure.s IBANForm(iban.s,form.i)
|
|
Define fn.s, c.i
|
|
fn=RemoveString(UCase(iban),Chr(32))
|
|
If form=#IBAN_NOSPACE : ProcedureReturn fn : EndIf
|
|
fn=Mid(fn,5)+Mid(fn,1,4)
|
|
For c=65 To 90
|
|
fn=ReplaceString(fn,Chr(c),Str(c-55))
|
|
Next c
|
|
If form=#IBAN_VAL_FORM : ProcedureReturn fn : EndIf
|
|
fn=Left(fn,Len(fn)-2)+"00"
|
|
If form=#IBAN_SUM_FORM : ProcedureReturn fn : EndIf
|
|
EndProcedure
|
|
|
|
Procedure.s m97iban(iban.s,calculate.i)
|
|
Define i.i, part.s, rest.s
|
|
Select calculate
|
|
Case #IBAN_VAL : iban=IBANForm(iban,#IBAN_VAL_FORM)
|
|
Case #IBAN_SUM : iban=IBANForm(iban,#IBAN_SUM_FORM)
|
|
EndSelect
|
|
For i=1 To Len(iban) ; Validierung der Prüfsumme
|
|
part+Mid(iban,i,1)
|
|
If Val(rest+part)<97 : Continue : EndIf
|
|
rest=Str((Val(rest+part)) %97) : part=""
|
|
Next
|
|
Select calculate
|
|
Case #IBAN_VAL : ProcedureReturn rest
|
|
Case #IBAN_SUM : ProcedureReturn RSet(Str(98-Val(rest+part)),2,"0")
|
|
EndSelect
|
|
EndProcedure
|
|
|
|
CCD("AL",28) : CCD("AD",24) : CCD("AT",20) : CCD("AZ",28) : CCD("BE",16) : CCD("BH",22) : CCD("BA",20)
|
|
CCD("BR",29) : CCD("BG",22) : CCD("CR",21) : CCD("HR",21) : CCD("CY",28) : CCD("CZ",24) : CCD("DK",18)
|
|
CCD("DO",28) : CCD("EE",20) : CCD("FO",18) : CCD("FI",18) : CCD("FR",27) : CCD("GE",22) : CCD("DE",22)
|
|
CCD("GI",23) : CCD("GR",27) : CCD("GL",18) : CCD("GT",28) : CCD("HU",28) : CCD("IS",26) : CCD("IE",22)
|
|
CCD("IL",23) : CCD("IT",27) : CCD("KZ",20) : CCD("KW",30) : CCD("LV",21) : CCD("LB",28) : CCD("LI",21)
|
|
CCD("LT",20) : CCD("LU",20) : CCD("MK",19) : CCD("MT",31) : CCD("MR",27) : CCD("MU",30) : CCD("MC",27)
|
|
CCD("MD",24) : CCD("ME",22) : CCD("NL",18) : CCD("NO",15) : CCD("PK",24) : CCD("PS",29) : CCD("PL",28)
|
|
CCD("PT",25) : CCD("RO",24) : CCD("SM",27) : CCD("SA",24) : CCD("RS",22) : CCD("SK",24) : CCD("SI",19)
|
|
CCD("ES",24) : CCD("SE",24) : CCD("CH",21) : CCD("TN",24) : CCD("TR",26) : CCD("AE",23) : CCD("GB",22)
|
|
CCD("VG",24)
|
|
|
|
DataSection
|
|
IBANData:
|
|
Data.s "GB82 WEST 1234 5698 7654 32"
|
|
Data.s "GB82WEST12345698765432"
|
|
Data.s "gb82 west 1234 5698 7654 32"
|
|
Data.s "GB82 TEST 1234 5698 7654 32"
|
|
Data.s "GR16 0110 1250 0000 0001 2300 695"
|
|
Data.s "GB29 NWBK 6016 1331 9268 19"
|
|
Data.s "SA03 8000 0000 6080 1016 7519"
|
|
Data.s "CH93 0076 2011 6238 5295 7"
|
|
Data.s "IL62 0108 0000 0009 9999 999"
|
|
Data.s "IL62-0108-0000-0009-9999-999"
|
|
Data.s "US12 3456 7890 0987 6543 210"
|
|
Data.s "GR16 0110 1250 0000 0001 2300 695X"
|
|
Data.s Chr(0)
|
|
EndDataSection
|
|
|
|
Define iban.s, cc.s
|
|
OpenConsole()
|
|
Restore IBANData
|
|
Repeat
|
|
Read.s iban : If iban=Chr(0) : Break : EndIf
|
|
Print("IBAN"+#TAB$+": "+LSet(iban,35,Chr(32))+#TAB$)
|
|
cc=Left(IBANForm(iban,#IBAN_NOSPACE),2)
|
|
If CData(cc)
|
|
If Not CData()=Len(IBANForm(iban,#IBAN_NOSPACE)) : PrintN("[INCORRECT: LENGTH]") : Continue : EndIf
|
|
Else
|
|
PrintN("[INCORRECT: COUNTRY]") : Continue
|
|
EndIf
|
|
If Not Val(m97iban(iban,#IBAN_VAL))=1 : PrintN("[INCORRECT: MOD97]") : Continue : EndIf
|
|
If Not Right(IBANForm(iban,#IBAN_VAL_FORM),2)=m97iban(iban,#IBAN_SUM)
|
|
PrintN("[INCORRECT: CHECKSUM]") : Continue
|
|
EndIf
|
|
PrintN("[CORRECT]")
|
|
ForEver
|
|
Input()
|
|
End
|