ISSN (англ. International Standard Serial Number) — уникальный номер, используемый для идентификации печатного или электронного периодического издания, состоящий из 8 цифр. 8 цифра — контрольное число, рассчитываемое по предыдущим 7 и модулю 11. Наряду с индексами ББК, УДК и авторским знаком, ISBN является частью так называемого издательского пакета.Стандарт был разработан в Великобритании в 1966 году, а в 1970 году с небольшим изменением был принят как международный стандарт ISO 2108. Существует также подобный стандарт ISSN (International Standard Serial Number) для периодических изданий. В России ISBN используется с 1987 года. Номера ISBN, присвоенные книгам до 2006 года издания включительно, имеют длину 10 символов и состоят из четырёх полей переменной длины: страна происхождения или группа стран, объединенная языком издания (например: 0 и 1 — Английский язык, 2 — Французский, 3 — Немецкий, 4 — Япония, 5 — СССР / Россия, 600 — Иран, 7 — Китай, 80 — Чехия и Словакия, 953 — Хорватия, 9956 — Камерун, 99948 — Эритрея); код издательства (в России — от двух до 7 знаков); уникальный номер издания (в России — соответственно от 6 до 1 знака); контрольная цифра (арабская от 0 до 9 или римская X). Для использования в качестве штрихкодов формата EAN-13 к ISBN добавляется префикс 978 и вместо контрольной цифры ISBN используется контрольная цифра, рассчитанная по стандарту EAN-13. Выделен ещё один префикс — 979 Теперь посмотрим сам процесс вычисления: //Стандарт ISBN-13 принятый в 1.1.2007. function ISBN(const s: string; streng: Boolean): Boolean; var i, x, n: Integer; tmp: string; begin Result := True; if (not streng) or ((Copy(s, 1, 5) = '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 > 5) then 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 10) then Result := False; end else Result := False; end else Result := False; end else Result := False; end; //старый стандарт ISBN-10 function ValidISBN(const aISBN: string): boolean; var hNumber, hCheckDigit: string; hCheckValue, hCheckSum, Err: integer; i,Cnt: Word; begin Result := false; hCheckDigit := Copy(aISBN, Length(aISBN), 1); hNumber := Copy(aISBN, 1, Length(aISBN) - 2); {длина ISBN - 11} if (Length(hNumber)=11)and(Pos(hCheckDigit,'0123456789X') > 0) then begin if (hCheckDigit = 'X') then hCheckSum := 10 else Val(hCheckDigit, hCheckSum, Err); Cnt := 1; for i := 1 to 12 do begin if (Pos(hNumber[i], '0123456789') > 0) then begin Val(hNumber[i], hCheckValue, Err); hCheckSum := hCheckSum + hCheckValue * (11 - Cnt); Inc(Cnt); end; end; if (hCheckSum mod 11 = 0) then Result := true else Result := false; end; end; //думаю проблем с разбором быть не должно! </pre>
|