CheckIBAN(IBAN$)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

CheckIBAN(IBAN$)

Beitrag 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.
Zuletzt geändert von Rudi am 18.05.2014 13:47, insgesamt 1-mal geändert.
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

Re: CheckIBAN()

Beitrag 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.
Zuletzt geändert von Rudi am 18.05.2014 19:24, insgesamt 1-mal geändert.
Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: CheckIBAN(IBAN$)

Beitrag 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
Bild
Benutzeravatar
Rudi
Beiträge: 143
Registriert: 22.04.2010 18:28
Wohnort: #PB_Any

Re: CheckIBAN(IBAN$)

Beitrag von Rudi »

Win7 (x64)PB 5.4x (x86)5,7 Windows-LeistungsindexSuche
Antworten