Validar códigos ISBN  

Enviado Por: Q3 Team
Web : http://www.q3.nu
Email: dlib@q3.nu
Fecha: 16/07/99

Truco accedido 175 veces

 


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. Buscalo en alguno de tus libros.

Un ISBN de ejemplo:


                               3-88053-002-5



Está compuesto por:
Grupo : 3Editor : 88053Libro : 002Dígito de Control : 5



A estas alturas, te preguntarás ¿como se calcula el dígito de control ?

Con el ISBN del ejemplo:
ISBN:3880530025
Multiplicador:10987654321
Producto:30+72+64+0+30+15+0+0+04+05=220



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.

Aqui tienes una función que te dirá si un ISBN es válido o no:


   function IsISBN(ISBN: String): Boolean;
   var
     Number, CheckDigit: String;
     CheckValue, CheckSum, Err: Integer;
     i, Cnt: Word;
   begin
     {Get check digit}
     CheckDigit := Copy(ISBN, Length(ISBN), 1);
     {Get rest of ISBN, minus check digit and its hyphen}
     Number := Copy(ISBN, 1, Length(ISBN) - 2);
     {Length of ISBN remainder must be 11 and check digit between 9 and 9 or X}
     if (Length(Number) = 11) and (Pos(CheckDigit, '0123456789X') > 0) then
       begin
       {Get numeric value for check digit}
       if (CheckDigit = 'X') then
         CheckSum := 10
       else
         Val(CheckDigit, CheckSum, Err);
       {Iterate through ISBN remainder, applying decode algorithm}
       Cnt := 1;
       for i := 1 to 12 do begin
         {Act only if current character is between "0" and "9" to exclude hyphens}
         if (Pos(Number[i], '0123456789') > 0) then begin
           Val(Number[i], CheckValue, Err);
           {Algorithm for each character in ISBN remainder, Cnt is the nth
           character so processed}
           CheckSum := CheckSum + CheckValue * (11 - Cnt);
           Inc(Cnt);
         end;
       end;
       {Verify final value is evenly divisible by 11}
       if (CheckSum MOD 11 = 0) then
         IsISBN := True
       else
         IsISBN := False;
     end
     else
       IsISBN := False;
   end;



Ejemplo de llamada:


  	If IsISBN ('3880530025') then ShowMessage('ISBN válido') else ShowMessage('ISBN invalido...');