[BlueLeaf1336]> PROGRAM> Natural Born Junk>

ISBNコードチェッカー

historyTOP

2002/10/30:作成

memoTOP

C言語による最新アルゴリズム辞典(奥村晴彦著)を参考にした。
指定した文字列がISBNコードとして正しいかどうかをチェックする。
どのような場面で使用するのか不明。

codeTOP

(*
    =================================================
    ISBNコードチェッカー
    =================================================
*)
function CheckISBN(pISBN: string): Boolean;
const
    ISBN_LENGTH      = 10;
    ISBN_MEAN_OF_TEN = 'X';
    ISBN_MEAN_OF_X   = 10;
    MININT           = Low(integer);
var
    i: integer;
    Check: integer;
begin

    Result := False;
    Check  := 0;

    //指定文字列長以外はダメ
    if Length(pISBN) <> ISBN_LENGTH then Exit;

    //重み付けを行いながら加算していく
    //ただし最後の文字はおいておく
    //さらに数値以外の文字の場合は、圧倒的負数を加算しておく
    for i := 1 to ISBN_LENGTH - 1 do
    begin
        Check := Check + (ISBN_LENGTH - i + 1) * StrToIntDef(pISBN[i], MININT);
    end;

    //最後の文字がXのとき10を意味し、数値の時はそのまま使用
    if pISBN[ISBN_LENGTH] = ISBN_MEAN_OF_TEN then
    begin
        Check := Check + ISBN_MEAN_OF_X;
    //また、最後の文字が数値以外なら即やめ
    end else
    if StrToIntDef(pISBN[ISBN_LENGTH], MININT) <> MININT then
    begin
        Check := Check + StrToInt(pISBN[ISBN_LENGTH]);

    end else
    begin
        Exit;
    end;

    //ここまでの結果が負ならアウト
    if Check < 0 then Exit;

    //結果が11の倍数でなければアウト
    if (Check mod 11) <> 0 then Exit;

    Result := True;

end;
(*
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++
    テスト
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++
*)
procedure TForm1.Button1Click(Sender: TObject);
const
    ISBN = 'ISBN4-415-08600-4';
var
    aISBN: string;
begin
    aISBN := StringReplace(ISBN, 'ISBN', '', [rfReplaceAll]);
    aISBN := StringReplace(aISBN, '-', '', [rfReplaceAll]);
    ShowResult(BoolToStr(CheckISBN(aISBN), True));
end;

EOFTOP