ISBN や ISBN-13 の説明はWikipediaにお任せするとして
「接頭記号」 + 「グループ記号」 + 「出版者記号」 + 「書名記号」 (ハイフン除くと12桁)の値から
末尾に付与するチェックディジットまで含めたISBN-13の値を求めたい場合、
以下のようなメソッドを用意すればできます。
public final class ISBN13 { public static String generate(String src) { final String str12 = src.replace("-", ""); if (str12.length() != 12) { throw new IllegalArgumentException(str12); } return str12 + checkDigit(str12); } private static int checkDigit(String str12) { // ウェイトの1および3 final int[] weights = { 1, 3 }; int sum = 0; for (int i = 0; i < str12.length(); i++) { // sum += Integer.valueOf(str12.charAt(i)) * weights[i & 1] <- NG!!! sum += Character.getNumericValue(str12.charAt(i)) * weights[i & 1]; } final int r = 10 - (sum % 10); if (r == 10) { return 0; } return r; }
試してみる
public static void main(String[] args) { System.out.println(ISBN13.generate("978479733720")); System.out.println(ISBN13.generate("978-4-7973-3720")); System.out.println(ISBN13.generate("978410109205")); System.out.println(ISBN13.generate("978030640615")); System.out.println(ISBN13.generate("978-0-30-640615")); System.out.println(ISBN13.generate("978316148410")); }
出力結果
9784797337204 9784797337204 9784101092058 9780306406157 9780306406157 9783161484100
分かりにくいですが、ISBN-13を意味する13桁表現の値が取得できます。