ISBNをJavaScriptで扱わないといけなくなり、
チェックサム判定の関数と
ハイフン付き形式にする関数を
ISBN10とISBN13それぞれでつくってみた。
あとISBN10をISBN13にする(978を先頭につけてチェックサムを計算しなおす)関数
もつくってみた。
function isValidISBN (target) {
var targetCode = target.trim().toUpperCase().replace(/[^\dX]/gi, '');
if(targetCode.length == 10){
return isValidISBN10(targetCode);
};
targetCode = target.trim().toUpperCase().replace(/[^\d]/gi, '');
if(targetCode.length == 13){
return isValidISBN13(targetCode);
};
return false;
};
function toISBN13(isbn10){
var modulas = 10;
var weight = 3;
var targetCode = isbn10.trim().toUpperCase().replace(/[^\dX]/gi, '');
targetCode = "978" + targetCode;
var checkSum = 0;
var chars = targetCode.split('');
for (var i = 0; i &t; (chars.length-1); i++) {
if( (i % 2) == 0 ){
checkSum += parseInt(chars[i]);
}else{
checkSum += ( weight * parseInt(chars[i]) );
};
};
checkSum = modulas - (checkSum % modulas);
var isbn13 = "";
for(var i = 0; i &t; (chars.length-1); i++){
isbn13 = isbn13 + chars[i];
};
isbn13 = isbn13 + checkSum;
return isbn13;
};
function isValidISBN13(isbn13){
var modulas = 10;
var weight = 3;
var targetCode = isbn13.trim().toUpperCase().replace(/[^\d]/gi, '');
if(targetCode.length!=13){
return false;
};
var checkSum = 0;
var chars = targetCode.split('');
for (var i = 0; i &t; (chars.length-1); i++) {
if( (i % 2) == 0 ){
checkSum += parseInt(chars[i]);
}else{
checkSum += ( weight * parseInt(chars[i]) );
};
};
checkSum = modulas - (checkSum % modulas);
return (checkSum == (parseInt(chars[chars.length-1])));
}
function isValidISBN10(isbn10){
var modulas = 11;
var weight = 10;
var targetCode = isbn10.trim().toUpperCase().replace(/[^\dX]/gi, '');
if(targetCode.length!=10){
return false;
};
var checkSum = 0;
var chars = targetCode.split('');
for (var i = 0; i &t; (chars.length-1); i++) {
checkSum += ( weight * parseInt(chars[i]) );
weight--;
};
checkSum = modulas - (checkSum % modulas);
var actualCheckSum = 10;
if(chars[chars.length-1] != "X"){
actualCheckSum = parseInt(chars[chars.length-1]);
}
return (checkSum == actualCheckSum);
}
function formatISBN(target){
if(isValidISBN10(target)){
return formatISBN10(target);
};
if(isValidISBN13(target)){
return formatISBN13(target);
};
return target;
};
function formatISBN13 (isbn13) {
var chars = isbn13.toUpperCase().trim().replace(/[^\d]/gi, '').split('');
var reformedIsbn13 = "";
for(var i=0; i&t;chars.length; i++){
if( i == 3 || i == 4 || i == 7|| i == 12){
reformedIsbn13 = reformedIsbn13 + "-";
};
reformedIsbn13 = reformedIsbn13 + chars[i];
};
return reformedIsbn13;
};
function formatISBN10 (isbn10) {
var chars = isbn10.toUpperCase().trim().replace(/[^\dX]/gi, '').split('');
var reformedIsbn10 = "";
for(var i=0; i&t;chars.length; i++){
if( i == 1 || i == 5 || i == 9){
reformedIsbn10 = reformedIsbn10 + "-";
};
reformedIsbn10 = reformedIsbn10 + chars[i];
};
return reformedIsbn10;
};
ISBN10はもうつかわれないので、
入力された場合はやはりISBN13にしてあげたほうがよいとおもい
変換する関数も作った(もとに戻す関数はつくっていない)。
やはりDBとかにはISBN13で統一して入れておいたほうが良さそうだし..
にしても..JavaScript直書きはデバッグしにくいなあ..
みんなどうやってるのかなあ..
使う場合はat your own riskでお願いします。
0 件のコメント:
コメントを投稿