Validar códigos ISBN
Artículo por Club Developers · 31 diciembre 2005
5716 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:
Ejemplo de llamada:
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
 function IsISBN(ISBN: String): Boolean;  var   Number, CheckDigit: String;   CheckValue, CheckSum, Err: Integer;   i, Cnt: Word;  begin   CheckDigit := Copy(ISBN, Length(ISBN), 1);   Number := Copy(ISBN, 1, Length(ISBN) - 2);   if (Length(Number) = 11) and (Pos(CheckDigit, '0123456789X') > 0) then    begin    if (CheckDigit = 'X') then     CheckSum := 10    else     Val(CheckDigit, CheckSum, Err);    Cnt := 1;    for i := 1 to 12 do begin     if (Pos(Number[i], '0123456789') > 0) then begin      Val(Number[i], CheckValue, Err);      CheckSum := CheckSum + CheckValue * (11 - Cnt);      Inc(Cnt);     end;    end;    if (CheckSum mod 11 = 0) then     IsISBN := True    else     IsISBN := False;   end   else    IsISBN := False;  end;
Ejemplo de llamada:
delphi
if IsISBN ('3880530025') then  ShowMessage('ISBN válido') else  ShowMessage('ISBN invalido...');