ISBN validieren

Über die ISBN lassen sich nichtperiodische Veröffentlichung eines Verlags (z.B. Bücher) identifizieren. Zum 1.1.2007 wird die bisherige, seit 1972 gültige, zehnstellige ISBN durch eine 13-stellige Kennung abgelöst.
Mit dieser Funktion lässt sich die neue ISBN-13 validieren:

uses SysUtils;

{Funktion validiert ISBN-13
Gültig ab 1.1.2007
Wenn streng = True, wird die Voranstellung von 'ISBN ' und die korrekte
Verwendung der Bindestriche verlangt}

function ISBN(const s: string; streng: Boolean): Boolean;
var
  i, x, n: Integer;
  tmp: string;
begin
  Result := True;
  if (not streng) or ((Copy(s, 15) = 'ISBN 'and (Length(s) = 22)
    and (s[9] = '-'and (s[21] = '-')) then
  begin
    for i := 1 to Length(s) do
      if s[i] in ['0'..'9'then
        tmp := tmp + s[i]
      else
        if streng then
          if (s[i] = '-'then
            Inc(n)
          else
          if (i > 5then
            Result := False;
    if (Result) and ((not streng) or (n = 4)) then
    begin
      if Length(tmp) = 13 then
      begin
        for i := 1 to 12 do
          if i div 2 = i/2 then
            x := x + StrToInt(tmp[i]) * 3
          else
            x := x + StrToInt(tmp[i]);
        if StrToInt(tmp[13]) <> ((10 - (x mod 10)) mod 10then
          Result := False;
      end
      else
        Result := False;
    end
    else
      Result := False;
  end
  else
    Result := False;
end;

Über den Parameter "streng" lässt sich kontrollieren, ob einfach nur die Prüfziffer, oder auch der korrekte Aufbau nach dem Muster "ISBN xxx-x-xxx-xxxxx-x" überprüft werden soll.
ISBN('ISBN 978-3-7657-2780-1', True) //liefert True zurück

ISBN('9783765727801', True) //liefert False zurück

ISBN('ISBN 978-3-7657-2780-1', False) //liefert True zurück

ISBN('9783765727801', False) //liefert True zurück

Über dieses Formular können Sie eine ISBN-13 online validieren: