This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
isbn-13 [01/12/2006 16:58] fernando |
isbn-13 [29/11/2010 00:00] (current) |
||
---|---|---|---|
Line 9: | Line 9: | ||
* [[http://www.isbn-international.org/en/manual.html|ISBN Users' Manual]] | * [[http://www.isbn-international.org/en/manual.html|ISBN Users' Manual]] | ||
- | * [[http://www.oclc.org/news/announcements/announcement96.htm|OCLC Interim Support for ISBN 13]] (pdf) | + | * [[http://www.oclc.org/news/announcements/announcement96.htm|OCLC Interim Support for ISBN 13]] |
- | * [[http://www.isbn-international.org/en/download/implementation-guidelines-04.pdf|Guidelines for the implementation of 13-digit ISBNs]] | + | * [[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}} |