ISBN, JAN。2、ISBNサブクラス
一昨日作った Ean クラスを継承して ISBN-10 のチェックデジット算出を行うクラスを作ってみました。
ISBN-13 と ISBN-10 のみ対応としてるところなんかは、これぞ継承!という感じかと。
勝手にそう思ってるだけですが。
パッケージ構成は前のものをそのまま利用(継承)した形になります。
ISBN, JAN。クラスライブラリ - DumBoさんの Homebrew 開発日記
パッケージ構成
./IsbnTest.java ./jp/regekatsu/utility/WpcAbstract.java ./jp/regekatsu/utility/Ean.java ./jp/regekatsu/utility/Isbn.java
./IsbnTest.java
/*--------------------------------------------------------------------------------- class IsbnTest version 0.01 May 22, 2012 by DumBo ---------------------------------------------------------------------------------*/ import jp.regekatsu.utility.Isbn; class IsbnTest { public static void main(String[] args) { Isbn isbn13 = new Isbn(Isbn.CODE_ISBN13); Isbn isbn10 = new Isbn(Isbn.CODE_ISBN10); isbn13.setCode("978123456789"); isbn10.setCode("123456789"); System.out.println("ISBN-13コード(現行規格13桁) : " + isbn13.getCode() + isbn13.getCheckDigit()); System.out.println("ISBN-10コード(廃止規格10桁) : " + isbn10.getCode() + isbn10.getCheckDigit()); } }
./jp/regekatsu/utility/Isbn.java
/*--------------------------------------------------------------------------------- class Isbn extends Ean version 0.01 May 22, 2012 by DumBo ---------------------------------------------------------------------------------*/ package jp.regekatsu.utility; public class Isbn extends Ean { public static final int CODE_ISBN10 = 9; static final int MODULUS_ISBN10 = 11; static final int WAIT_ISBN10 = 10; public Isbn(int codeSize) { super(codeSize); //コード桁数が ISBN-13(13桁) または ISBN-10(10桁) からチェックデジット1桁 を引いた数であるか確認する if(!(codeSize == CODE_ISBN13 || codeSize == CODE_ISBN10)){ throw new IllegalArgumentException("コード桁数は ISBN-13(" + String.valueOf(CODE_ISBN13) + "桁) または ISBN-10(" + String.valueOf(CODE_ISBN10) + "桁) を指定してください"); } } public String getCheckDigit() { String checkDigit; switch(codeSize) { //コード桁が ISBN-10 幅なら ISBN-10 として計算する。 case CODE_ISBN10: /* 計算方法 1.各桁をそれぞれ、10桁目 * 10, 9桁目 * 9, ... 2桁目 * 2 と乗算して、結果を全て合計する。 2.合計から÷11で余りを求める。 3.11から余りを引く。 4.結果が 10 なら 'X'、 11 なら '0' で、それ以外ならその結果の数がチェックデジットとなる。 */ //各桁の計算 int temporaryDigit = 0; for(int i = 0;i < WAIT_ISBN10 - 1;i++) temporaryDigit += Integer.parseInt(code.substring(i, i + 1)) * (WAIT_ISBN10 - i); //結果の計算 temporaryDigit = MODULUS_ISBN10 - (temporaryDigit % MODULUS_ISBN10); if(temporaryDigit == 10) checkDigit = "X"; else if(temporaryDigit == 11) checkDigit = "0"; else checkDigit = String.valueOf(temporaryDigit); break; //コード桁が ISBN-13 幅なら ISBN-13 として計算する。 case CODE_ISBN13: checkDigit = super.getCheckDigit(); break; //それ以外の場合が発生したら例外処理を行う default: throw new IllegalArgumentException("予期しない例外が発生しました。"); } return checkDigit; } }