ISBN, JAN。2、ISBNサブクラス


一昨日作った Ean クラスを継承して ISBN-10 のチェックデジット算出を行うクラスを作ってみました。
ISBN-13 と ISBN-10 のみ対応としてるところなんかは、これぞ継承!という感じかと。
勝手にそう思ってるだけですが。


パッケージ構成は前のものをそのまま利用(継承)した形になります。


ISBN, JAN。クラスライブラリ - DumBoさんの Homebrew 開発日記


IsbnTest.jar


パッケージ構成

./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;
        
    }
    
}