Validar códigos ISBN
Artículo por Club Developers · 31 diciembre 2005
6463 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...');


