Kontonummer überprüfen

creativeheadz

Erfahrenes Mitglied
Hey,
ich versuche seit gestern Abend, Kontonummern zu überprüfen. Dabei handelt es sich speziell um Postbank Kontonummern.

Bei der Deutschen Bundesbank gibt es eine PDF Datei, welche alle Prüfsummenberechnungsbeschreibungen beinhaltet.

http://www.bundesbank.de/download/zahlungsverkehr/zv_pz201109.pdf

Die Berechnung für die Postbank ist die Nummer 24. Diese hat folgende Beschreibung:

Modulus 11,

Gewichtung 1, 2, 3, 1, 2, 3, 1, 2, 3

Die für die Berechnung relevanten Stellen der Kontonummer befinden sich - von links nach rechts gelesen -in den Stellen 1 - 9; die Prüfziffer in Stelle 10. Die Kontonummer ist rechtsbündig zu interpretieren und ggf. mit Nullen aufzufüllen. Die einzelnen Ziffern der Kontonummer sind, beginnend mit der ersten Ziffer ungleich 0, von links nach rechts bis einschließlich Stelle 9 mit den o. g. Gewichtungsfaktoren zu multiplizieren. Zum jeweiligen Produkt ist der zugehörige Gewichtungsfaktor zu addieren (zum ersten Produkt +1, zum zweiten +2, zum dritten +3, zum Vierten +1 usw.). Das jeweilige Ergebnis ist durch 11 zu dividieren (5 : 11 = 0 Rest 5). Die sich aus der Division ergebenden Reste sind zu summieren. Die letzte Ziffer dieser Summe ist die Prüfziffer.

Ausnahmen:

1) Eine ggf. in Stelle 1 vorhandene Ziffer 3, 4, 5 oder 6 wird als 0 gewertet. Der o. g. Prüfalgorithmus greift erst ab der ersten Stelle ungleich 0.

2) Eine ggf. in Stelle 1 vorhandene Ziffer 9 wird als 0 gewertet und führt dazu, dass auch die beiden nachfolgenden Ziffern in den Stellen 2 und 3 der Kontonummer als 0 gewertet werden müssen. Der o. g. Prüfalgorithmus greift in diesem Fall alsoerst ab Stelle 4 der 10stelligen Kontonummer. Die Stelle 4 ist ungleich 0.

In der Datei werden Beispielkontonummer verwendet mit denen ich auch gearbeitet habe.

138301, 1306118605, etc..

Wenn ich nun meinen Code mit den in der PDF Datei angegebenen Kontonummern teste, funktioniert das Skript einwandfrei und die Prüfsumme ist korrekt. Sobald ich aber einmal meine "echte" Postbankkontonummer angebe bzw. die eines Freundes dann stimmt die Prüfsumme nicht. Nun stehe ich ein wenig auf dem Schlauch und weiss nicht wirklich wie ich nun am besten an das Problem herangehen soll :rolleyes:

Hier ist nun mein Code: (Ausgabe muss noch summiert werden. Die letzte Ziffer der Summe ist die Prüfziffer.)


PHP:
<?php

// Kontonummer

$account_number = "138301";

		// Gewichtungsfaktoren 
				
		$factor = array(1,2,3,1,2,3,1,2,3,1);
				
		// Modulus 
				
		$mod = 11;		

		// Ausnahme 1
		
		 $first_number = substr($account_number,0,1);

		 if($first_number[0] == 3 OR $first_number[0] == 4 OR $first_number[0] == 5 OR $first_number[0] == 6){
		 
		   $account_number = substr($account_number,1);
		 
		 }else{
		 
		 // Ausnahme 2
		 
		  if($first_number[0] == 9){
		  
		   $account_number = substr($account_number,3);
		   
		  }else{
		 
		   $account_number = $account_number;
		 
		  }
		 
		 } 

	  $default_length = strlen($account_number) - 1; // -1 da letzte Ziffer Prüfziffer ist nicht berechnet wird

	  $sum = 0;

	  for($i=0; $i<$default_length; $i++) {
	 
	   $splited_number[$i] = substr($account_number,$i,1);  
	
		  $splited_number[$i] = $splited_number[$i] * $factor[$i] + $factor[$i];
		  
		  $splited_number[$i] = $splited_number[$i] % $mod ;
		  
		  echo $splited_number[$i].'-';

		}	

?>

Gruß
 
Falls es dich beruhigt: Bei meiner Postbankkontonummer kommt das mit der Prüfziffernberechnung hin...:) Und auch in deinem Quellcode sieht es eigentlich in Ordnung aus.
 
Hi,

Die für die Berechnung relevanten Stellen der Kontonummer befinden sich - von links nach rechts gelesen -in den Stellen 1 - 9; die Prüfziffer in Stelle 10. Die Kontonummer ist rechtsbündig zu interpretieren und ggf. mit Nullen aufzufüllen. Die einzelnen Ziffern der Kontonummer sind, beginnend mit der ersten Ziffer ungleich 0, von links nach rechts bis einschließlich Stelle 9 mit [...]

Ich weiß nicht genau, wie das zu interpretieren ist. Besonders, was hier "rechtsbündig" heisst und von welcher Seite mit Nullen aufgefüllt wird.

Es hört sich ja so an, als wenn du immer 9 Stellen für die Berechnung haben müsstest, währen die erste Stelle (von links) keine Null ist.

Das heisst bei einer Nummer "138301" (wobei die 1 am Ende, ja die Prüfziffer ist) bleibt als reale Kontonummer die "13830". Da du ja 9 Stellen brauchst und die erste ungleich Null sein soll, müsste doch dann von rechts mit Nullen aufgefüllt werden, oder verstehe ich das falsch: "138300000".

Wenn das so ist, fehlt dieses "Padding" (mit Nullen auffüllen) in deiner Berechnung (einen Schritt vor der for-Schleife).

Außerdem: Warum nennt die Anleitung die Gewichtung "1,2,3,1,2,3,1,2,3", während du im Code "1,2,3,1,2,3,1,2,3,1" hast (also eine Eins am Ende mehr)?

Ansonsten sieht der Algorithmus gut aus, wobei ich ihn nicht getestet habe.

Welche Kontonummer funktioniert denn nicht? (Wenn du deine nicht posten möchtest, gibt's vielleicht eine von ner öffentlichen Organisation, der Stadtverwaltung oder so)
 
Zuletzt bearbeitet:
Aber dann macht ja
Die einzelnen Ziffern der Kontonummer sind, beginnend mit der ersten Ziffer ungleich 0, von links nach rechts bis einschließlich Stelle 9 mit den o. g. Gewichtungsfaktoren zu multiplizieren.
keinen Sinn.

Bzw. es könnte sein, dass es keine 9 Stellen gibt, oder?
 
Wenn das so ist, fehlt dieses "Padding" (mit Nullen auffüllen) in deiner Berechnung (einen Schritt vor der for-Schleife).

Ja schon allerdings greift der Algorithmus erst aber der ersten Zahl ungleich Null, was ja wiederum bedeutet das die ersten Nullen wegfallen.

Außerdem: Warum nennt die Anleitung die Gewichtung "1,2,3,1,2,3,1,2,3", während du im Code "1,2,3,1,2,3,1,2,3,1" hast (also eine Eins am Ende mehr)?

Die Gewichtung wird doch immer gleich fortgesetzt. Es könnten doch theoretisch 20, 30, oder 40 Stellen sein. (1,2,3,1,2,3,1,2,31,2,3,1,2,3,1,2,3 etc. ) Der Algorithmus läuft ja ohnehin nur die vorhandene Anzahl an Zeichen ab.
 
Zurück