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

FloydHubを使ってKerasのサンプル lstm_text_generation.py を動かしてみる

タイムラインにふらっと入ってきた記事で FloydHubというものを知った。 FloydHub https://www.floydhub.com/ Heroku風の機械学習環境のPaaSとのこと。 .. そもそもHeroku知らない んですけど..というかPyth...