Validar códigos ISBN

5306 vistas

Los códigos ISBN permiten identificar cualquier libro. Es como su matrÃcula. Tienen un formato definido, el cual incluye un dígito de control para validarlo.

Un ISBN de ejemplo: 3-88053-002-5

donde

[table]
[tr]
[td]Grupo : 3[/td]
[td]Editor : 88053[/td]
[td]Libro : 002[/td]
[td]DÃgito de Control : 5[/td]
[/tr]
[/table]

Veamos ahora cómo se calcula el dígito de control

[table]
[tr]
[td]ISBN:[/td]
[td]3[/td]
[td]8[/td]
[td]8[/td]
[td]0[/td]
[td]5[/td]
[td]3[/td]
[td]0[/td]
[td]0[/td]
[td]2[/td]
[td]5[/td]
[td] [/td]
[/tr]
[tr]
[td]Multiplier:[/td]
[td]10[/td]
[td]9[/td]
[td]8[/td]
[td]7[/td]
[td]6[/td]
[td]5[/td]
[td]4[/td]
[td]3[/td]
[td]2[/td]
[td]1[/td]
[td] [/td]
[/tr]
[tr]
[td]Product:[/td]
[td]30+[/td]
[td]72+[/td]
[td]64+[/td]
[td]0+[/td]
[td]30+[/td]
[td]15+[/td]
[td]0+[/td]
[td]0+[/td]
[td]04+[/td]
[td]05[/td]
[td]=220[/td]
[/tr]
[/table]

Como ves, se trata de multiplicar cada dígito del ISBN por un factor que depende de su posición, sumando todos los resultados. Al final, si el resultado es divisible por 11, el ISBN es válido.

Asà pues, veamos una función que nos indicará si un ISBN es válido o no:



delphi
  1.   function IsISBN(ISBN: String): Boolean;
  2.   var
  3.     Number, CheckDigit: String;
  4.     CheckValue, CheckSum, Err: Integer;
  5.     i, Cnt: Word;
  6.   begin
  7.     CheckDigit := Copy(ISBN, Length(ISBN), 1);
  8.     Number := Copy(ISBN, 1, Length(ISBN) - 2);
  9.     if (Length(Number) = 11) and (Pos(CheckDigit, '0123456789X') > 0) then
  10.       begin
  11.       if (CheckDigit = 'X') then
  12.         CheckSum := 10
  13.       else
  14.         Val(CheckDigit, CheckSum, Err);
  15.       Cnt := 1;
  16.       for i := 1 to 12 do begin
  17.         if (Pos(Number[i], '0123456789') > 0) then begin
  18.           Val(Number[i], CheckValue, Err);
  19.           CheckSum := CheckSum + CheckValue * (11 - Cnt);
  20.           Inc(Cnt);
  21.         end;
  22.       end;
  23.       if (CheckSum mod 11 = 0) then
  24.         IsISBN := True
  25.       else
  26.         IsISBN := False;
  27.     end
  28.     else
  29.       IsISBN := False;
  30.   end;



Ejemplo de llamada:




delphi
  1. if IsISBN ('3880530025') then
  2.   ShowMessage('ISBN válido')
  3. else
  4.   ShowMessage('ISBN invalido...');