Hilfe bei Algorithmus berechnung

crashx

Erfahrenes Mitglied
Es geht darum den Algorythmus der Prüfzifferberechnung der Schweizer Post irgendwie mit PHP umzusetzen.

Ich habe von der Post einen Codeschnippsel bekommen aber verstehe ihn nicht ganz.
Vielleicht kann mir jemand weiter helfen.

Code:
Function pz10(kto)
On Error GoTo Err_pz10
Dim lg As String
Dim pos As String
Dim k As Integer
Const zr_post As String = "0946827135094682713"
     If IsNumeric(kto) Then
         I = 0
         lg = Len(kto)
         For J = 1 To lg
              k = Val(Mid(kto, J, 1))
              I = Val(Mid(zr_post, I + k + 1, 1))	
        Next J
        pz10 = (10 - I) Mod 10
     Else
        pz10 = "*"
     End If
Exit_pz10:
    Exit Function
Err_pz10:
    pz10 = "*"
    Resume Exit_pz10
End Function
Format der Referenznummer / Prüffziffer
6400 8
 

ZodiacXP

Erfahrenes Mitglied
Die hätten dir das lieber als Struktogramm schicken sollen :p

Welche Prüfziffer ist denn das?
Einzahlungsschein? Postcheckkonti?
Bisschen kurz ^ ^

btw:

on error goto err_pz => try { ... } catch (e as Exception) { ... }
Mid => substr
x mod y => x % y
resume / exit => return
dim lg as String => $lg = "";
Und alle anderen Variablen mit $ versteht sich ;)

So ungefähr kann mans übernehmen. HF
 
Zuletzt bearbeitet:

crashx

Erfahrenes Mitglied
Du sagst das so einfach ein bischen kurz ;)

Mehr habe ich auch nicht.

Die Einzahlungsscheine sehen wiefolgt aus.

6400 <- fortlaufende nummerierung des EZS danach noch eine Prüfziffer die bei 6400 8 ist
bei 6401 ist die Prufziffer 3

Ich glaube bei
Function pz10(kto) muss kto = zb. 6400 sein.
 

ZodiacXP

Erfahrenes Mitglied
AH. Das ist ESR9 von den orangen Scheinen links mittig, oder? Hoffe ich doch ;)

So geht ESR9 :
Man geht von Ü = 0 aus und nutzt folgende Matrix:

Code:
		0	1	2	3	4	5	6	7	8	9

0		0	9	4	6	8	2	7	1	3	5	0
1		9	4	6	8	2	7	1	3	5	0	9
2		4	6	8	2	7	1	3	5	0	9	8
3		6	8	2	7	1	3	5	0	9	4	7
4		8	2	7	1	3	5	0	9	4	6	6
5		2	7	1	3	5	0	9	4	6	8	5
6		7	1	3	5	0	9	4	6	8	2	4
7		1	3	5	0	9	4	6	8	2	7	3
8		3	5	0	9	4	6	8	2	7	1	2
9		5	0	9	4	6	8	2	7	1	3	1

Am Beispiel 6400:
Ü ist die Zeile beim ersten mal immer 0 (Null). Also auch nur diese Zeile betrachten:
Code:
		0	1	2	3	4	5	6	7	8	9

0		0	9	4	6	8	2	7	1	3	5	0
Die erste Ziffer ist die 6, das heißt in der sechsten Spalte gucken und so erhält man die 7 als neues Ü. Das heißt für die nächste Ziffer die Zeile 7 angucken:

Code:
		0	1	2	3	4	5	6	7	8	9

7		1	3	5	0	9	4	6	8	2	7	3
und da unsere nächste Ziffer 4 ist ergibt sich dadraus Ü = 9
also auf zur neunten Zeile:

Code:
		0	1	2	3	4	5	6	7	8	9

9		5	0	9	4	6	8	2	7	1	3	1
Nun die dritte Ziffer von 6400 (eine 0 - Null) und daraus ergibt sich Ü = 5
Heißt weiter zur fünften Zeile:

Code:
		0	1	2	3	4	5	6	7	8	9

5		2	7	1	3	5	0	9	4	6	8	5
Als nächste Ziffer von 6400 kommt wieder eine Null womit sich hier Ü = 2 ergibt.
Wäre unsere Zahl 6401 dann wäre Ü = 7 ;)

Nun zieht man von 10 das Ü ab...
für 6400 wäre das: 10 - 2 = 8
für 6401 wäre das: 10 - 7 = 3

Nachvollziehbar?
So funktioniert das.
 

crashx

Erfahrenes Mitglied
Danke für die Anleitung.

Aber Irgendwie stehe ich auf dem Schlauch, ich schnall es nicht wirklich.
Werde mir das mal genauer zu gemüte führen müssen :)

Aber Danke trozdem.
 

crashx

Erfahrenes Mitglied
aha....
dann ist 6402 10-1 = 9
und 6403 = 10-3 = 7

oder?

und nun das ganze noch in PHP :(
 
Zuletzt bearbeitet:

ZodiacXP

Erfahrenes Mitglied
Genau. Das System hast verstanden.
Und der passende Code dazu wurde dir ja gegeben. Mit meinen Hinweisen ganz am Anfang kann man das fast schon 1:1 übernehmen, was dir geschickt wurde.
 

crashx

Erfahrenes Mitglied
Ich habe es noch nicht ganz begriffen.

Hier mal mein ansatz, vielleicht hat jemand eine Idee.

PHP:
<?PHP
function pz10($kto){

$zr_post = 0946827135094682713;
  if(is_integer($kto)){
    $i = 0;
    $lg = strlen($kto);
    for($j = 1; $j > $lg; $j++){
      $k = Val(Mid($kto, $j, 1)); // Das verstehe ich nicht
      $i = Val(Mid($zr_post, $i + $k + 1, 1));  // und das hier auch nicht
	}	
    $pz10 = 10 - $i;
  }else{
    $pz10 = "*";
  }
}
?>
 

kuddeldaddeldu

Erfahrenes Mitglied
Hi,

die Funktionen "Val" und "Mid" gibt es in PHP nicht. ZodiacXP hat Dir die entsprechenden Funktionen doch schon gepostet:

Mid: [phpf]substr[/phpf] (darauf achten, dass in PHP der Index bei 0 beginnt)
Val: Castet in einen numerischen Wert, hier würde ich [phpf]intval[/phpf] nehmen

Außerdem hast Du das modulo nach der Schleife vergessen. Der Operator dazu ist in PHP "%".

LG
 

crashx

Erfahrenes Mitglied
Da ich die ganze funktion nicht ganz verstehe, habe ich versucht diese zu Interpretieren so wie ich das gefühl habe es könnte gehen.

Ich kann aber das ganze nicht richtig nachvollziehen bzw. das in PHP umsetzen.
Das grundprinzip habe ich schon verstanden aber meine beschränkte Logik lässt es mich nicht umsetzen :)