User Tools

Site Tools


isbn-13

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
isbn-13 [05/05/2009 18:18]
fernando
isbn-13 [29/11/2010 00:00] (current)
Line 13: Line 13:
   * [[http://​www.isbn-international.org/​en/​download/​implementation-guidelines-04.pdf|Guidelines for the implementation of 13-digit ISBNs]] (pdf)   * [[http://​www.isbn-international.org/​en/​download/​implementation-guidelines-04.pdf|Guidelines for the implementation of 13-digit ISBNs]] (pdf)
  
 +
 +==== Herramientas ====
 +
 +  * [[http://​code.google.com/​p/​isbnjs/​|isbnjs - An ISBN JavaScript Library]]
 +  * [[http://​pcn.loc.gov/​isbncnvt.html|ISBN Converter (LC)]], incluye algoritmo para generar guiones (aparentemente incompleto):​ http://​pcn.loc.gov/​Templates/​isbncnvt.js
 +
 +Pego aquí el código JS por las dudas:
 +
 +<code javascript>​
 +// **************************************************************
 +// Validation/​conversion functions for ISBN numbers
 +
 +var bAlert;
 +
 +function convertISBN(form)
 +{
 + // Set default variables and cleanup ISBN
 + var form = document.isbncnvt;​
 + form.isbn_in.value = form.isbn_in.value.replace(/​[-\s]/​g,""​).toUpperCase();​
 + var isbnnum = form.isbn_in.value;​
 + var isbn10exp = /​^\d{9}[0-9X]$/;​
 + var isbn13exp = /^\d{13}$/;
 + var isbnlen = isbnnum.length;​
 + var total = 0;
 +
 + // Preliminary validation
 + if (isbnlen == 0) {
 + alert("​Please enter an ISBN to convert in the first box."​);​
 +        form.isbn_in.focus();​
 +      form.isbn_in.select();​
 +       ​ return false;
 +    }
 +
 + if ((form.isbn_out.value != ""​) && (isbnlen == 0)) {
 + alert("​Please enter the ISBN to convert in the first box."​);​
 +        form.isbn_in.focus();​
 +        form.isbn_in.select();​
 +        return false;
 +    }
 +
 +    if (!(isbn10exp.test(isbnnum)) && !(isbn13exp.test(isbnnum))) {
 + if ((isbnlen != 10) && (isbnlen != 13)) {
 + ​ alert("​This ISBN is invalid."​ + "​\n"​ +
 +    ​  ​     "It contains " + isbnlen + " characters."​);​
 + }
 + else {
 + ​ alert("​This ISBN is invalid."​ + "​\n"​ +
 +    ​  ​     "It contains invalid characters."​);​
 + }
 +          form.isbn_in.focus();​
 +          form.isbn_in.select();​
 +          return false;
 +    }
 +
 + // Validate & convert a 10-digit ISBN
 + if (isbnlen == 10) {
 + // Test for 10-digit ISBNs:
 + // Formulated number must be divisible by 11
 + // 0234567899 is a valid number
 + for (var x=0; x<9; x++) { 
 + total = total+(isbnnum.charAt(x)*(10-x)); ​
 + }
 +
 + // check digit
 + z = isbnnum.charAt(9);​
 + if (z == "​X"​) { z = 10; }
 +
 + // validate ISBN
 + if ((total+z*1) % 11 != 0) {   // modulo function gives remainder
 + z = (11 - (total % 11)) % 11;
 + if (z == 10) { z = "​X";​ }
 + alert("​This 10-digit ISBN is invalid."​ + "​\n"​ +
 +       "The check digit should be " + z + "​."​);​
 + form.isbn_in.focus();​
 + form.isbn_in.select();​
 + return false;
 + }
 + else {
 + // convert the 10-digit ISBN to a 13-digit ISBN
 + isbnnum = "​978"​+isbnnum.substring(0,​9);​
 + total = 0;
 + for (var x=0; x<12; x++) {
 + if ((x % 2) == 0) { y = 1; }
 + else { y = 3; }
 + total = total+(isbnnum.charAt(x)*y);​
 + }
 + z = (10 - (total % 10)) % 10;
 + }
 + }
 +
 + // Validate & convert a 13-digit ISBN
 + else { 
 + // Test for 13-digit ISBNs
 + // 9780234567890 is a valid number
 + for (var x=0; x<12; x++) {
 + if ((x % 2) == 0) { y = 1; }
 + else { y = 3; }
 + total = total+(isbnnum.charAt(x)*y);​
 + }
 +
 + // check digit
 + z = isbnnum.charAt(12);​
 +
 + // validate ISBN
 + if ((10 - (total % 10)) % 10 != z) {   // modulo function gives remainder
 + z = (10 - (total % 10)) % 10; 
 + alert("​This 13-digit ISBN is invalid."​ + "​\n"​ +
 +       "The check digit should be " + z + "​."​);​
 + form.isbn_in.focus();​
 + form.isbn_in.select();​
 + return false;
 + }
 + else {
 + // convert the 13-digit ISBN to a 10-digit ISBN
 + if ((isbnnum.substring(0,​3) != "​978"​)) {
 + alert("​This 13-digit ISBN does not begin with \"​978\""​ + "​\n"​ +
 +       "It cannot be converted to a 10-digit ISBN."​);​
 + form.isbn_in.focus();​
 + form.isbn_in.select();​
 + return false;
 + }
 + else {
 + isbnnum = isbnnum.substring(3,​12);​
 + total = 0;
 + for (var x=0; x<9; x++) {
 + total = total+(isbnnum.charAt(x)*(10-x));​
 + }
 + z = (11 - (total % 11)) % 11;
 + if (z == 10) { z = "​X";​ } 
 + }
 + }
 + }
 + if (form.hyphenate.checked == true) {
 + bAlert = true;
 + form.isbn_in.value = hyphenate(form.isbn_in.value);​
 + bAlert = false;
 + form.isbn_out.value = hyphenate(isbnnum+z);​
 + }
 + else { form.isbn_out.value = isbnnum+z; } 
 + return true;
 +
 +}//​convertISBN(form)
 +
 +function hyphenate(isbn)
 +{
 +
 +var prefix;
 +
 +if (isbn.length == 13) // for 13-digit ISBNs
 +{
 + prefix = isbn.substring(0,​3) + "​-";​
 + isbn = isbn.substring(3,​13);​
 +}
 +else { prefix = '';​ }
 +
 +var d = eval(isbn.substring(0,​1));​ //​ one digit
 +var d2 = eval(isbn.substring(1,​3));​ //​ two digits
 +var d4 = eval(isbn.substring(1,​5));​ //​ four digits
 +var objRegExp = "";​
 +
 +switch(d) {
 + case 0:
 +    case 3:
 +    case 4:
 +/*
 +0 = English-speaking areas
 +3 = German-speaking areas
 +4 = Japan
 +*/
 + switch(true) {
 + case (d2 < 20):
 + objRegExp = /​(\d)(\d{2})(\d{6})(\w)/;​
 +         break;
 +        case (d2 < 70):
 + objRegExp = /​(\d)(\d{3})(\d{5})(\w)/;​
 +   break;
 +        case (d2 < 85):
 + objRegExp = /​(\d)(\d{4})(\d{4})(\w)/;​
 +   break;
 +        case (d2 < 90):
 + objRegExp = /​(\d)(\d{5})(\d{3})(\w)/;​
 +   break;
 +        case (d2 < 95):
 + objRegExp = /​(\d)(\d{6})(\d{2})(\w)/;​
 +   break;
 +        case (d2 <= 99):
 + objRegExp = /​(\d)(\d{7})(\d)(\w)/;​
 + break;
 +        default:
 +         break;
 + }
 + break;
 +
 + case 1:
 +/*
 +1 = English-speaking areas
 +*/
 + switch(true) {
 + case (d4 < 1000):
 + objRegExp = /​(\d)(\d{2})(\d{6})(\w)/;​
 +         break;
 +        case (d4 < 4000):
 + objRegExp = /​(\d)(\d{3})(\d{5})(\w)/;​
 + break;
 +        case (d4 < 5500):
 + objRegExp = /​(\d)(\d{4})(\d{4})(\w)/;​
 +   break;
 +        case (d4 < 8698):
 + objRegExp = /​(\d)(\d{5})(\d{3})(\w)/;​
 +   break;
 +        case (d4 < 9990):
 + objRegExp = /​(\d)(\d{6})(\d{2})(\w)/;​
 + break;
 +        case (d4 <= 9999):
 + objRegExp = /​(\d)(\d{7})(\d)(\w)/;​
 +   break;
 +        default:
 +         break;
 + }
 + break;
 +
 +    case 2:
 +/*
 +2 = French-speaking areas
 +*/
 + switch(true) {
 + case (d2 < 20):
 + objRegExp = /​(\d)(\d{2})(\d{6})(\w)/;​
 +         break;
 +        case (d2 < 70):
 + objRegExp = /​(\d)(\d{3})(\d{5})(\w)/;​
 +   break;
 +        case (d2 < 84):
 + objRegExp = /​(\d)(\d{4})(\d{4})(\w)/;​
 + break;
 +        case (d2 < 90):
 + objRegExp = /​(\d)(\d{5})(\d{3})(\w)/;​
 + break;
 +        case (d2 < 95):
 + objRegExp = /​(\d)(\d{6})(\d{2})(\w)/;​
 +   break;
 +        case (d2 <= 99):
 + objRegExp = /​(\d)(\d{7})(\d)(\w)/;​
 + break;
 +        default:
 +         break;
 + }
 + break;
 +  ​
 +    case 9:
 +/*
 +90 = Dutch/​Flemish-speaking
 +*/ 
 +  if (isbn.substring(1,​2) == 0) {
 + d2 = isbn.substring(2,​4);​
 + switch(true) {
 + case (d2 < 20):
 + objRegExp = /​(\d{2})(\d{2})(\d{5})(\w)/;​
 +         break;
 +        case (d2 < 50):
 + objRegExp = /​(\d{2})(\d{3})(\d{4})(\w)/;​
 +   break;
 +        case (d2 < 70):
 + objRegExp = /​(\d{2})(\d{4})(\d{3})(\w)/;​
 +   break;
 +        case (d2 < 80):
 + objRegExp = /​(\d{2})(\d{5})(\d{2})(\w)/;​
 +   break;
 +        case (d2 <= 81):
 + objRegExp = /​(\d{2})(\d{6})(\d)(\w)/;​
 + break;
 +        default:
 +     break;
 + }
 +  }
 +
 +/*
 +965 = Israel
 +*/
 +  if (isbn.substring(1,​3) == 65) { 
 + d2 = isbn.substring(3,​5);​
 + switch(true) {
 + case (d2 < 20):
 + objRegExp = /​(\d{3})(\d{2})(\d{4})(\w)/;​
 +         break;
 +        case (d2 < 70):
 + objRegExp = /​(\d{3})(\d{3})(\d{3})(\w)/;​
 +   break;
 +        case (d2 < 90):
 + objRegExp = /​(\d{3})(\d{4})(\d{2})(\w)/;​
 +   break;
 +        case (d2 <= 95):
 + objRegExp = /​(\d{3})(\d{5})(\d)(\w)/;​
 +   break;
 +        default:
 +         break;
 + }
 +  }  ​
 +
 +/*
 +981 = Singapore
 +*/ 
 +  if (isbn.substring(1,​3) == 81) {
 + d2 = isbn.substring(3,​5);​
 + switch(true) {
 + case (d2 < 20):
 + objRegExp = /​(\d{3})(\d{2})(\d{4})(\w)/;​
 +         break;
 +        case (d2 < 30):
 + objRegExp = /​(\d{3})(\d{3})(\d{3})(\w)/;​
 +   break;
 +        case (d2 <= 40):
 + objRegExp = /​(\d{3})(\d{4})(\d{2})(\w)/;​
 +   break;
 +        default:
 +         break;
 + }
 +  }  ​
 +  else { break; }
 +
 +        break;
 +
 + default:
 +   ​ break;​
 +}
 +
 +if (objRegExp != ""​) {
 +       isbn = prefix + isbn.replace(objRegExp,​ "​$1-$2-$3-$4"​);​
 +}
 +else { 
 + if (bAlert == true) { alert("​Unable to hyphenate this ISBN!"​);​ }
 + isbn = (prefix + isbn).replace(/​[-]/​g,""​);​
 +}
 +return isbn;
 +}//​hyphenate(isbn)
 +</​code>​
  
 {{tag>​catalogacion}} {{tag>​catalogacion}}
isbn-13.1241558335.txt.gz · Last modified: 05/05/2009 00:00 (external edit)