Seite 1 von 1

CheckIBAN(IBAN$)

Verfasst: 15.05.2014 23:43
von Rudi

Code: Alles auswählen

EnableExplicit

Procedure CheckIBAN(IBAN$)
	Protected i, Divident$, Modulo, LA$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
	IBAN$ = UCase(RemoveString(IBAN$, " "))
	Protected nIBAN$ = Right(IBAN$, Len(IBAN$)-4) + Left(IBAN$, 4)
	
	For i=1	To Len(LA$)
		nIBAN$ = ReplaceString(nIBAN$, Mid(LA$, i, 1), Str(i+9), #PB_String_NoCase)
	Next
	
	For i=1 To Len(nIBAN$)
		Divident$ = Left(nIBAN$, i)
		If Val(Divident$) >= 97
			Modulo = Val(Divident$) % 97
			Break
		EndIf
	Next
	
	For i=i+1 To Len(nIBAN$)
		Modulo = Val(Str(Modulo) + Mid(nIBAN$, i, 1)) % 97
	Next
	
	ProcedureReturn Modulo
EndProcedure

Debug CheckIBAN("DE08 7009 0100 1234 5678 90")
Wenn "1" zurückgegeben wird, dann it's ok, andernfalls nicht.

Re: CheckIBAN()

Verfasst: 18.05.2014 13:46
von Rudi
Das geht aber auch noch einfacher:

Code: Alles auswählen

EnableExplicit

Procedure CheckIBAN(IBAN$)
	Protected i, Modulo, LA$ = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
	IBAN$ = UCase(RemoveString(IBAN$, " "))
	IBAN$ = Mid(IBAN$, 5) + Left(IBAN$, 4)
	
	For i=1	To Len(LA$)
		IBAN$ = ReplaceString(IBAN$, Mid(LA$, i, 1), Str(i+9), #PB_String_NoCase) ;Buchstaben in Zahlen tauschen
	Next
	
	For i=1 To Len(IBAN$)
		Modulo = Val(Str(Modulo) + Mid(IBAN$, i, 1)) % 97
	Next
	
	ProcedureReturn Modulo
EndProcedure

Debug CheckIBAN("DE08 7009 0100 1234 5678 90")
Edit: Nocheinmal leicht vereinfacht durch Nics Anregung.

Re: CheckIBAN(IBAN$)

Verfasst: 18.05.2014 14:45
von NicTheQuick
Und hier noch eine kleine Pointerversion:

Code: Alles auswählen

Procedure checkIBAN(IBAN.s)
	IBAN = UCase(RemoveString(IBAN, " "))
	IBAN = Mid(IBAN, 5) + Left(IBAN, 4)
	Protected *c.Character = @IBAN, modulo.i
	While *c\c
		If (*c\c <= '9')
			modulo = (modulo * 10 + *c\c - '0') % 97
		Else
			modulo = (modulo * 100 + *c\c - 'A' + 10) % 97
		EndIf
		*c + SizeOf(Character)
	Wend
	
	ProcedureReturn modulo
EndProcedure

Re: CheckIBAN(IBAN$)

Verfasst: 18.05.2014 15:15
von Rudi