ISBN 13

Algunos documentos para entender la nueva situación

Library of Congress plan to accommodate 13-digit ISBN

ISBN-13: New Number on the Block

ISBN Users' Manual

OCLC Interim Support for ISBN 13

Guidelines for the implementation of 13-digit ISBNs (pdf)

Herramientas

isbnjs - An ISBN JavaScript Library

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:

// ************************************************************** // 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)