0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ISBNのチェックデジットによる値の検証

Posted at

筆者について

name → Koki Teramoto
age → 18
language → ja_JP, en_US

本編

みなさんISBNとはご存知ですか?あの本の裏についているバーコードをおんなじ数字ですね。

今回Flutterでとあるアプリを作るときに、バーコードがISBNでありかつ正しく読み取れていることを検証する必要がありましたので今回はそのことについて少しメモに残しておきます。

チェックデジットの仕組み

ISBNの検算は日本図書コード管理センターのホームページですることができます。

さて、今回はこれとおんなじ仕組みをFlutter内で実装したいわけです。検算方法は下のPDFに記載されています。

\begin{gather}
\textrm{奇数の桁の数字の合計をa、偶数の桁の数字の合計をbとし、次の等式、} \\
{c \equiv a + 3b\pmod{10}} \\
\textrm{を満たすcがあるとき、最小桁の数(チェックデジット)dは次の等式を満たす。}\\
{d = 10 - c}\\
\end{gather}

もう一つの問題がISBNの値の範囲です。基本は978から始まるそうですのですが、一部の国では979からも始まるそうです。

ということで、上の二つの条件を意識した上で入力したISBNが正しいものかをチェックする関数を下のように作りました。

checkIsbn.dart
bool checkIsbn(String isbn) {
    List<String> isbnArray = isbn.split('');
    int checkSum = 0;
    bool isCorrectIsbn;
    for (int i = 0; i < isbnArray.length - 1; i++) {
      if ((i % 2) == 0) {
        checkSum += (int.parse(isbnArray[i]));
      } else {
        checkSum += (int.parse(isbnArray[i]) * 3);
      }
    }
    if (9799999999999 > int.parse(isbn) &&
        int.parse(isbn) > 9780000000000 &&
        (10 - (checkSum % 10)) == (int.parse(isbnArray.last))) {
      isCorrectIsbn = true;
    } else {
      isCorrectIsbn = false;
    }
    return isCorrectIsbn;
  }

注意しなければいけないこととして、関数は文字列での入力にしています。これには、自分の都合で文字列にするというのが一つ、もう一つは奇数桁と偶数桁で処理を分けるために配列を用いるのですが、そこでの処理を簡単位するために引数の方は文字列にしています。

最後に

この記事を書くのに久しぶりにLaTeXを使ったのですが、いやこれ難しすぎますね。ぼちぼちLaTeXも勉強していきたいと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?