筆者について
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も勉強していきたいと思います。