[C#] ISBN番号のバリデーションと生成方法

ISBN番号は書籍を識別するための国際標準図書番号で、ISBN-10とISBN-13の2種類があります。

ISBN-10は9桁の数字と1桁のチェックディジットで構成され、チェックディジットは次の式で計算されます:\((10 – (1a + 2b + 3c + \ldots + 9i) \mod 11) \mod 11\)。

ISBN-13は12桁の数字と1桁のチェックディジットで、チェックディジットは次の式で計算されます:\((10 – (1a + 3b + 1c + \ldots + 3l) \mod 10) \mod 10\)。

C#でのバリデーションは、これらの計算を実装して入力された番号が正しいか確認します。

この記事でわかること
  • ISBN-10とISBN-13の基本的な違いと構造
  • ISBN-10およびISBN-13のチェックディジットの計算方法
  • C#でのISBN番号のバリデーション実装方法
  • ISBN番号を生成するための手順とプログラム例
  • ISBN番号を活用した応用例としてのバーコード生成やデータベース統合の方法

目次から探す

ISBN番号の基礎知識

ISBNとは何か

ISBN(International Standard Book Number)は、書籍を特定するための国際的な標準番号です。

書籍の識別に用いられ、出版社、書籍のタイトル、版、フォーマットなどを特定するために使用されます。

ISBNは、書籍の販売や流通において重要な役割を果たしており、書店や図書館、オンライン書店などで広く利用されています。

ISBN-10とISBN-13の違い

ISBNには、ISBN-10とISBN-13の2つの形式があります。

それぞれの違いを以下の表にまとめます。

スクロールできます
特徴ISBN-10ISBN-13
桁数10桁13桁
使用開始年1970年2007年
チェックディジットモジュラス11(0-9またはX)モジュラス10(0-9)
主な用途古い書籍や特定の地域での使用現在の標準、国際的な使用

ISBN-10は1970年に導入され、10桁の数字で構成されています。

ISBN-13は2007年に導入され、13桁の数字で構成されており、EAN-13バーコードと互換性があります。

ISBN-13は、ISBN-10の先頭に 978 または 979 を追加した形式です。

ISBNの構造

ISBNは、以下の要素で構成されています。

  1. グループ識別子: 国や地域、言語グループを示す番号です。
  2. 出版社識別子: 出版社を特定する番号です。
  3. 書籍タイトル識別子: 書籍のタイトルや版を特定する番号です。
  4. チェックディジット: ISBNの正確性を確認するための数字です。

ISBN-10とISBN-13の構造は基本的に同じですが、ISBN-13にはEANコードの一部として 978 または 979 が追加されています。

これにより、ISBN-13は国際的なバーコードシステムと互換性を持ち、より広範な流通に対応しています。

ISBN-10のバリデーション

チェックディジットの計算方法

ISBN-10のチェックディジットは、モジュラス11を使用して計算されます。

計算方法は以下の通りです。

  1. ISBNの最初の9桁に、それぞれ1から9までの重みを掛けます。
  2. それらの積の合計を求めます。
  3. 合計を11で割った余りを求めます。
  4. 余りが0の場合、チェックディジットは0です。

それ以外の場合、11から余りを引いた値がチェックディジットになります。

もしその値が10の場合、チェックディジットは X となります。

数式で表すと以下のようになります:

\[\text{チェックディジット} = \left(11 – \left(\sum_{i=1}^{9} i \times \text{ISBN}[i]\right) \mod 11\right) \mod 11\]

C#でのバリデーション実装

以下は、C#でISBN-10のバリデーションを行うサンプルコードです。

using System;
public class ISBNValidator
{
    // ISBN-10のバリデーションを行うメソッド
    public bool ValidateISBN10(string isbn)
    {
        // ISBNが10桁であるか確認
        if (isbn.Length != 10)
        {
            return false;
        }
        int sum = 0;
        for (int i = 0; i < 9; i++)
        {
            // 各桁が数字であるか確認
            if (!char.IsDigit(isbn[i]))
            {
                return false;
            }
            // 各桁に重みを掛けて合計を計算
            sum += (isbn[i] - '0') * (i + 1);
        }
        // チェックディジットの計算
        char checkDigit = isbn[9];
        int remainder = sum % 11;
        if (remainder == 10)
        {
            return checkDigit == 'X';
        }
        else
        {
            return checkDigit == (remainder + '0');
        }
    }
}

バリデーションの例外処理

バリデーションを行う際には、以下のような例外処理を考慮する必要があります。

  • ISBNが10桁でない場合
  • ISBNに数字以外の文字が含まれている場合(チェックディジットを除く)
  • チェックディジットが不正な場合

これらの例外を適切に処理することで、バリデーションの信頼性を高めることができます。

完成したプログラム

以下は、ISBN-10のバリデーションを行う完成したプログラムです。

using System;
public class ISBNValidator
{
    // ISBN-10のバリデーションを行うメソッド
    public bool ValidateISBN10(string isbn)
    {
        // ISBNが10桁であるか確認
        if (isbn.Length != 10)
        {
            return false;
        }
        int sum = 0;
        for (int i = 0; i < 9; i++)
        {
            // 各桁が数字であるか確認
            if (!char.IsDigit(isbn[i]))
            {
                return false;
            }
            // 各桁に重みを掛けて合計を計算
            sum += (isbn[i] - '0') * (i + 1);
        }
        // チェックディジットの計算
        char checkDigit = isbn[9];
        int remainder = sum % 11;
        if (remainder == 10)
        {
            return checkDigit == 'X';
        }
        else
        {
            return checkDigit == (remainder + '0');
        }
    }
}

public class Program
{
    public static void Main()
    {
        ISBNValidator validator = new ISBNValidator();
        string isbn = "0306406152"; // サンプルISBN-10
        bool isValid = validator.ValidateISBN10(isbn);
        Console.WriteLine($"ISBN {isbn} は有効ですか?: {isValid}");
    }
}

このプログラムを実行すると、指定したISBN-10が有効かどうかを判定し、結果を表示します。

サンプルISBN 0306406152 は有効なISBN-10であるため、出力は「ISBN 0306406152 は有効ですか?: True」となります。

ISBN-13のバリデーション

チェックディジットの計算方法

ISBN-13のチェックディジットは、モジュラス10を使用して計算されます。

計算方法は以下の通りです。

  1. ISBNの最初の12桁に、交互に1と3の重みを掛けます。
  2. それらの積の合計を求めます。
  3. 合計を10で割った余りを求めます。
  4. 余りが0の場合、チェックディジットは0です。

それ以外の場合、10から余りを引いた値がチェックディジットになります。

数式で表すと以下のようになります:

\[\text{チェックディジット} = \left(10 – \left(\sum_{i=1}^{12} \text{ISBN}[i] \times (1 + 2 \times (i \mod 2))\right) \mod 10\right) \mod 10\]

C#でのバリデーション実装

以下は、C#でISBN-13のバリデーションを行うサンプルコードです。

using System;
public class ISBNValidator
{
    // ISBN-13のバリデーションを行うメソッド
    public bool ValidateISBN13(string isbn)
    {
        // ISBNが13桁であるか確認
        if (isbn.Length != 13)
        {
            return false;
        }
        int sum = 0;
        for (int i = 0; i < 12; i++)
        {
            // 各桁が数字であるか確認
            if (!char.IsDigit(isbn[i]))
            {
                return false;
            }
            // 各桁に重みを掛けて合計を計算
            int digit = isbn[i] - '0';
            sum += digit * (i % 2 == 0 ? 1 : 3);
        }
        // チェックディジットの計算
        int remainder = sum % 10;
        int checkDigit = (10 - remainder) % 10;
        return checkDigit == (isbn[12] - '0');
    }
}

バリデーションの例外処理

バリデーションを行う際には、以下のような例外処理を考慮する必要があります。

  • ISBNが13桁でない場合
  • ISBNに数字以外の文字が含まれている場合
  • チェックディジットが不正な場合

これらの例外を適切に処理することで、バリデーションの信頼性を高めることができます。

完成したプログラム

以下は、ISBN-13のバリデーションを行う完成したプログラムです。

using System;
public class ISBNValidator
{
    // ISBN-13のバリデーションを行うメソッド
    public bool ValidateISBN13(string isbn)
    {
        // ISBNが13桁であるか確認
        if (isbn.Length != 13)
        {
            return false;
        }
        int sum = 0;
        for (int i = 0; i < 12; i++)
        {
            // 各桁が数字であるか確認
            if (!char.IsDigit(isbn[i]))
            {
                return false;
            }
            // 各桁に重みを掛けて合計を計算
            int digit = isbn[i] - '0';
            sum += digit * (i % 2 == 0 ? 1 : 3);
        }
        // チェックディジットの計算
        int remainder = sum % 10;
        int checkDigit = (10 - remainder) % 10;
        return checkDigit == (isbn[12] - '0');
    }
}
public class Program
{
    public static void Main()
    {
        ISBNValidator validator = new ISBNValidator();
        string isbn = "9780306406157"; // サンプルISBN-13
        bool isValid = validator.ValidateISBN13(isbn);
        Console.WriteLine($"ISBN {isbn} は有効ですか?: {isValid}");
    }
}

このプログラムを実行すると、指定したISBN-13が有効かどうかを判定し、結果を表示します。

サンプルISBN 9780306406157 は有効なISBN-13であるため、出力は「ISBN 9780306406157 は有効ですか?: True」となります。

応用例

バーコード生成との連携

ISBN番号は、書籍の識別において重要な役割を果たしており、バーコードとして印刷されることが一般的です。

ISBN-13はEAN-13バーコードと互換性があるため、バーコード生成ライブラリを使用して簡単にバーコードを生成できます。

C#では、ZXing.NetBarcodeLibといったライブラリを利用して、ISBN番号からバーコードを生成することが可能です。

ZXing.NetBarcodeLibを使用する場合は、Nugetからのインストールが必要です。

以下は、ZXing.Netを使用してISBN-13のバーコードを生成するサンプルコードです。

using ZXing;
using ZXing.Common;
using System.Drawing;
using System.Drawing.Imaging;

public class BarcodeGenerator
{
    // ISBN-13からバーコードを生成するメソッド
    public Bitmap GenerateBarcode(string isbn13)
    {
        var writer = new BarcodeWriterPixelData
        {
            Format = BarcodeFormat.EAN_13,
            Options = new EncodingOptions
            {
                Width = 300,
                Height = 150
            }
        };

        var pixelData = writer.Write(isbn13);

        // Bitmapに変換
        var bitmap = new Bitmap(pixelData.Width, pixelData.Height, PixelFormat.Format32bppRgb);
        var bitmapData = bitmap.LockBits(new Rectangle(0, 0, pixelData.Width, pixelData.Height),
            ImageLockMode.WriteOnly, PixelFormat.Format32bppRgb);
        try
        {
            System.Runtime.InteropServices.Marshal.Copy(pixelData.Pixels, 0, bitmapData.Scan0,
                pixelData.Pixels.Length);
        }
        finally
        {
            bitmap.UnlockBits(bitmapData);
        }

        return bitmap;
    }
}

public class Program
{
    public static void Main()
    {
        BarcodeGenerator generator = new BarcodeGenerator();
        string isbn13 = "9783161484100"; // ここで正しいISBN-13を使用
        Bitmap bitmap = generator.GenerateBarcode(isbn13);
        bitmap.Save("barcode.png", ImageFormat.Png);
        bitmap.Dispose();
        Console.WriteLine("Done.");
    }
}

このコードを使用すると、有効なISBN-13を指定した場合はバーコードとして画像に変換できます(無効なISBNだとエラー発生)。

生成されたバーコードの例

生成されたバーコードは、書籍のカバーや販売用のラベルに印刷することができます。

データベースとの統合

ISBN番号は、書籍情報を管理するデータベースにおいても重要なキーとなります。

データベースにISBN番号を保存することで、書籍の検索や管理が容易になります。

C#では、Entity FrameworkDapperなどのORMを使用して、ISBN番号を含む書籍情報をデータベースに統合することができます。

以下は、Entity Frameworkを使用してISBN番号をデータベースに保存するためのサンプルコードです。

using System;
using System.Data.Entity;
public class Book
{
    public int Id { get; set; }
    public string ISBN { get; set; }
    public string Title { get; set; }
    public string Author { get; set; }
}
public class BookContext : DbContext
{
    public DbSet<Book> Books { get; set; }
}
public class DatabaseExample
{
    public void AddBook(string isbn, string title, string author)
    {
        using (var context = new BookContext())
        {
            var book = new Book { ISBN = isbn, Title = title, Author = author };
            context.Books.Add(book);
            context.SaveChanges();
        }
    }
}

このコードを使用すると、ISBN番号を含む書籍情報をデータベースに保存し、後で検索や更新を行うことができます。

Webアプリケーションでの利用

ISBN番号は、Webアプリケーションにおいても広く利用されています。

オンライン書店や図書館のWebサイトでは、ISBN番号を使用して書籍を検索したり、詳細情報を表示したりすることができます。

C#では、ASP.NET Coreを使用して、ISBN番号を利用したWebアプリケーションを構築することが可能です。

以下は、ASP.NET Coreを使用してISBN番号を検索するための簡単なWebアプリケーションのサンプルコードです。

using Microsoft.AspNetCore.Mvc;
using System.Linq;
public class BooksController : Controller
{
    private readonly BookContext _context;
    public BooksController(BookContext context)
    {
        _context = context;
    }
    // ISBN番号で書籍を検索するアクションメソッド
    public IActionResult Search(string isbn)
    {
        var book = _context.Books.FirstOrDefault(b => b.ISBN == isbn);
        if (book == null)
        {
            return NotFound();
        }
        return View(book);
    }
}

このコードを使用すると、ユーザーがISBN番号を入力して書籍を検索し、その詳細情報を表示するWebページを作成できます。

これにより、ユーザーは簡単に書籍情報にアクセスできるようになります。

よくある質問

ISBN番号のバリデーションが失敗する原因は?

ISBN番号のバリデーションが失敗する主な原因は以下の通りです。

  • 桁数の不一致: ISBN-10は10桁、ISBN-13は13桁である必要があります。

桁数が異なる場合、バリデーションは失敗します。

  • 不正な文字: ISBN番号には数字のみが含まれている必要があります(ISBN-10のチェックディジットが X の場合を除く)。

数字以外の文字が含まれていると、バリデーションは失敗します。

  • チェックディジットの不一致: 計算されたチェックディジットが実際のチェックディジットと一致しない場合、バリデーションは失敗します。

ISBN番号を手動で生成することは可能か?

ISBN番号を手動で生成することは技術的には可能ですが、通常は推奨されません。

ISBN番号は、書籍の識別において重要な役割を果たしており、正確な情報に基づいて生成される必要があります。

出版社は、ISBN番号を正しく管理し、適切な手続きに従って取得することが求められます。

手動で生成する場合は、正しいグループ識別子、出版社識別子、書籍タイトル識別子を使用し、正確なチェックディジットを計算する必要があります。

ISBN番号のバリデーションを効率化する方法は?

ISBN番号のバリデーションを効率化するための方法は以下の通りです。

  • 正規表現の使用: ISBN番号の形式を正規表現で事前にチェックすることで、桁数や不正な文字の検出を効率化できます。

例:^\d{9}[\dX]$(ISBN-10の場合)や^\d{13}$(ISBN-13の場合)。

  • ライブラリの活用: ISBNのバリデーションを行うためのライブラリを使用することで、バリデーションの実装を簡素化し、効率化できます。
  • キャッシュの利用: 同じISBN番号のバリデーションを繰り返し行う場合、結果をキャッシュすることで処理を効率化できます。

まとめ

この記事では、ISBN番号のバリデーションと生成方法について、C#を用いた具体的な実装例を通じて詳しく解説しました。

ISBN-10とISBN-13の違いや、それぞれのチェックディジットの計算方法、さらに実際のプログラムコードを示すことで、ISBN番号の取り扱いに関する理解を深めることができたのではないでしょうか。

これを機に、ISBN番号を活用したアプリケーションの開発や、既存のシステムへの統合を検討してみてはいかがでしょうか。

当サイトはリンクフリーです。出典元を明記していただければ、ご自由に引用していただいて構いません。

関連カテゴリーから探す

  • URLをコピーしました!
目次から探す