...compute a Modul 10 check number?

Author: Frank Rosendahl

Category: Math

//Errechnet eine Prüfziffer nach Modula 10

function modula10(zahl: Int64): Int64;
{
    Nach diesem Verfahren werden z.B. die Prüfziffern
    von EAN-Codes (immer die ganz rechte Stelle) berechnet.
    Das System funktioniert wie folgt:
    Angenommener Code 4205 4504 (Camel Filter)
    Die letzte Stelle wollen wir berechnen, diese
    wird also nicht mit einbezogen.
    Die einzelen Stellen werden abwechselnd mit
    3 und 1 multipliziert wobei rechts immer mit
    3 begonnen wird. Die Summe der Produkte wird
    durch 10 (dem Modul) geteilt, der Rest wird von
    10 abgezogen. Sollte hierbei 10 übrigbleiben
    ist die Prüfziffer 0. Hier das Beispiel:

    Stelle      Wert    Wichtung    Produkt
      1           4   *    3          12
      2           2   *    1           2
      3           0   *    3           0
      4           5   *    1           5
      5           4   *    3          12
      6           5   *    1           5
      7           0   *    3           0
                                    -------
    Summe                             36

    Summe / 10(Modul) = 3 Rest 6

    10(Modul) - 6(Rest) = 4  <- Die Prüfziffer
    Wenn der Rest 0 ist wäre die Prüfziffer also 10.
    Da aber nur eine Stelle zur Verfügung steht,
    wird die Prüfziffer 0.
}
var 
  
wert: Longint;
  multi: Word;
begin
  
//Rechte Stelle wird immer mit 3 multipliziert
  
multi := 3;
  wert  := 0;
  repeat
    
//Wert erhöhen um den Wert der letzten Stelle * Multiplikator
    
wert := wert + (zahl - trunc(zahl / 10) * 10) * multi;
    //Multiplikator ist abwechselnd 3 und 1
    
if multi = 3 then multi := 1 
    else 
      
multi := 3;
    //Letzte Stelle der Zahl abschneiden
    
zahl := trunc(zahl / 10);
  until zahl = 0;
  //Prüfziffer ermitteln
  
Result := 10 - (wert - trunc(wert / 10) * 10);
  //Wenn
  
if Result = 10 then Result := 0;
end;

function ismodula10(zahl: Int64): Boolean;
  //Prüft mit Hilfe von "modula10", ob die letzte
  //(rechte) Stelle als Prüfziffer korrekt ist.
begin
  
//letzte Stelle Abschneiden und Prüfziffer errechnen,
  //dann mit letzter Stelle der übergebenen Zahl vergleichen
  
if modula10(trunc(zahl / 10)) = zahl - (trunc(zahl / 10) * 10) then
    
Result := True 
  else 
    
Result := False;
end;

 

printed from
www.swissdelphicenter.ch
developers knowledge base