Created
October 28, 2013 07:35
-
-
Save Makistos/7192727 to your computer and use it in GitHub Desktop.
This code will check both ISBN-10 and ISBN-13 codes for validity. String length, characters and check digit are checked. Java regexp class is used, so this is an example on how to use it, too. #isbn #regexp #java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.regex.*; | |
/** | |
* @brief This class is used to verify that input is a valid ISBN (International | |
* Standard Book Number). | |
* | |
* @note Invalid ISBN-13 codes have been published in books! Do not assume | |
* that just because this returns false for an existing ISBN, there is a bug. | |
* Verify with e.g. Amazon that the ISBN is correct first. | |
* | |
* @author mep | |
*/ | |
class ISBNChecker { | |
/** | |
* | |
* A valid ISBN 12 digits from 0-9 and the last digit which can be 0-9 or X | |
* (which represents ten in the modulo result). | |
* | |
* @param isbn | |
* @return Boolean | |
*/ | |
private Boolean checkDigits(String isbn) { | |
Pattern pattern = Pattern.compile("^(978|979){0,1}[0-9]{9}[0-9xX]{1}$"); | |
Matcher matcher = pattern.matcher(isbn); | |
return matcher.matches(); | |
} | |
/** | |
* @brief This method validates that the check digit in the ISBN (the last | |
* digit) matches. | |
* | |
* @param isbn The ISBN to check. | |
* @return Boolean | |
*/ | |
private Boolean validCheckDigit(String isbn) { | |
int sum = 0; | |
int len = isbn.length(); | |
Boolean retVal = false; | |
int remainder; | |
String digit = isbn.substring(len - 1); | |
if (len == 10) { | |
// ISBN-10 checking | |
for (int k = 1; k < len; k++) { | |
sum += k * Character.getNumericValue(isbn.charAt(k-1)); | |
} | |
remainder = sum % 11; | |
if ((remainder) == 0) { | |
if (digit.compareTo("0") == 0) { | |
retVal = true; | |
} | |
} else if (remainder == 10) { | |
if (digit.compareToIgnoreCase("x") == 0) { | |
retVal = true; | |
} | |
} else { | |
if (Integer.parseInt(digit) == remainder) { | |
retVal = true; | |
} | |
} | |
} else if (len == 13) { | |
// ISBN-13 checking | |
int sub; | |
for (int k = 1; k <= len; k++) { | |
if (k % 2 == 1) { | |
sum += Character.getNumericValue(isbn.charAt(k-1)); | |
} else { | |
sum += 3 * Character.getNumericValue(isbn.charAt(k-1)); | |
} | |
remainder = sum % 10; | |
sub = 10 - remainder; | |
remainder = sub % 10; | |
if (remainder == 10) { | |
remainder = 0; | |
} | |
if (Integer.parseInt(digit) == remainder) { | |
retVal = true; | |
} | |
} | |
} | |
return retVal; | |
} | |
/** | |
* @brief Checks that the input given is a valid ISBN. | |
* | |
* @param str ISBN to check. | |
* | |
* @return Boolean. | |
*/ | |
Boolean check(String str) { | |
String isbn; | |
/* Remove dashes from the isbn. They do have a meaning but checking | |
their validity would be a ridiculous task.*/ | |
isbn = str.replace("-", ""); | |
/* Verify that the number part of the ISBN is all numbers and the | |
* last digit is either 0-9 or X. | |
*/ | |
if (checkDigits(isbn) == false) { | |
return false; | |
} | |
/* Verify that the check digit is correct */ | |
if (validCheckDigit(isbn) == false) { | |
return false; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment