Translate

2014年9月9日火曜日

ISBNコードのチェックサム判定するJavaScript関数をつくってみた


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 件のコメント:

ClaudeをOpenAI O1のように思考させるDifyサンプルを試す

 Difyの「探索」タブにはさまざまなサンプルが載っており、その1つに「Thinking Claude (OpenAI O1 Alternative)」というものがある。   このサンプルがどういうものか、未だに自分でも解けない以下の問題をためしに聞いてみることにした。 『人類の...