[C#] ISBN番号のバリデーションと生成方法
ISBN番号は書籍を識別するための国際標準図書番号で、ISBN-10とISBN-13の2種類があります。
ISBN-10は9桁の数字と1桁のチェックディジットで構成され、チェックディジットは次の式で計算されます:
ISBN-13は12桁の数字と1桁のチェックディジットで、チェックディジットは次の式で計算されます:
C#でのバリデーションは、これらの計算を実装して入力された番号が正しいか確認します。
ISBN番号の基礎知識
ISBNとは何か
ISBN(International Standard Book Number)は、書籍を特定するための国際的な標準番号です。
書籍の識別に用いられ、出版社、書籍のタイトル、版、フォーマットなどを特定するために使用されます。
ISBNは、書籍の販売や流通において重要な役割を果たしており、書店や図書館、オンライン書店などで広く利用されています。
ISBN-10とISBN-13の違い
ISBNには、ISBN-10とISBN-13の2つの形式があります。
それぞれの違いを以下の表にまとめます。
特徴 | ISBN-10 | ISBN-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は、以下の要素で構成されています。
- グループ識別子: 国や地域、言語グループを示す番号です。
- 出版社識別子: 出版社を特定する番号です。
- 書籍タイトル識別子: 書籍のタイトルや版を特定する番号です。
- チェックディジット: ISBNの正確性を確認するための数字です。
ISBN-10とISBN-13の構造は基本的に同じですが、ISBN-13にはEANコードの一部として 978
または 979
が追加されています。
これにより、ISBN-13は国際的なバーコードシステムと互換性を持ち、より広範な流通に対応しています。
ISBN-10のバリデーション
チェックディジットの計算方法
ISBN-10のチェックディジットは、モジュラス11を使用して計算されます。
計算方法は以下の通りです。
- ISBNの最初の9桁に、それぞれ1から9までの重みを掛けます。
- それらの積の合計を求めます。
- 合計を11で割った余りを求めます。
- 余りが0の場合、チェックディジットは0です。
それ以外の場合、11から余りを引いた値がチェックディジットになります。
もしその値が10の場合、チェックディジットは X
となります。
数式で表すと以下のようになります:
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を使用して計算されます。
計算方法は以下の通りです。
- ISBNの最初の12桁に、交互に1と3の重みを掛けます。
- それらの積の合計を求めます。
- 合計を10で割った余りを求めます。
- 余りが0の場合、チェックディジットは0です。
それ以外の場合、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.Net
やBarcodeLib
といったライブラリを利用して、ISBN番号からバーコードを生成することが可能です。
以下は、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 Framework
やDapper
などの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番号のバリデーションと生成方法について、C#を用いた具体的な実装例を通じて詳しく解説しました。
ISBN-10とISBN-13の違いや、それぞれのチェックディジットの計算方法、さらに実際のプログラムコードを示すことで、ISBN番号の取り扱いに関する理解を深めることができたのではないでしょうか。
これを機に、ISBN番号を活用したアプリケーションの開発や、既存のシステムへの統合を検討してみてはいかがでしょうか。