スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

数字1桁は全角、2桁以上は半角に変換するスクリプト

Indesign CS2のJavaScriptを使った、数字1桁を全角、2桁以上を半角に変換するスクリプトです。
テキストファイルを読み込んで変換し、再度テキストファイルに書き戻します。

//
// 数字1桁は全角、2桁以上は半角に変換するスクリプト
//

var tmpFileObj;
var srcText, distText;

//ダイアログで元ファイルを指定する
var srcFileRef = File.openDialog("txtファイルを選択してください", "txtファイル:*.txt" );
var srcFileObj = new File(srcFileRef);

//元ファイルをReadOnlyで開く
var flag = srcFileObj.open("r");

//ファイルオープンに成功した場合
if (flag == true) {
//作業用ファイルのファイル名を決定する。パスは元ファイルと同じ
do {
tmpFileObj = new File(srcFileObj.path + "/" + "hoge" + Math.floor(Math.random() * 10000) + 1 + ".tmp");
} while(tmpFileObj.exist)

//作業用ファイルをWrite属性で開く
tmpFileObj.open("w");

//新しい保存ファイルのエンコードは元ファイルと同じ
tmpFileObj.encoding = srcFileObj.encoding;

while(!srcFileObj.eof) {
srcText = srcFileObj.readln();
distText = numberConvert(srcText);
tmpFileObj.writeln(distText);
}

//元ファイル、作業用ファイルを閉じる
srcFileObj.close();
tmpFileObj.close();

do {
//保存ダイアログで保存するファイル名を指定する
distFileRef = File.saveDialog("保存", "txtファイル:*.txt" );
//OKが押された場合の処理
if(distFileRef != null) {
var distFileObj = new File(distFileRef);
//同じ名前のファイルがあった場合、上書き保存確認ダイアログを出す
if(distFileObj.exists) {
res = confirm("上書き保存しますか?");
//OKが押されたら元ファイルを削除、キャンセルならばループ先頭へ
if(res) distFileObj.remove()
else continue;
}
//作業用ファイルの名前を保存ファイル名にリネームし、ファイルオブジェクトを削除する
tmpFileObj.rename(distFileObj.name);
delete distFileObj;
break;
} else {
//保存ダイアログでキャンセルが押されたら作業用ファイルを削除する
tmpFileObj.remove();
break;
}
} while(1);

//ファイルオブジェクトを削除する
delete srcFileObj;
delete tmpFileObj;

} else {
alert("ファイルが開けませんでした。"); // ファイルオープンに失敗した場合
}

//
// 任意の半角数字1文字の前後が数字でない場合はその数字を全角に変換する関数
//
function numberConvert(srcText) {

var tmpStr = "";

// 全角数字を半角数字に変換
srcText = numZen2Han(srcText);

// 任意の半角数字1文字の前後が数字でない場合
for(i = 0; i < srcText.length; i++) {
switch(i) {
case 0: // 半角数字が行頭にあり、後の文字が数字(ピリオド、カンマ、ハイフンを含む)でない場合
if( (srcText[i].match(/[0-9]/) != null) && (srcText[i+1].match(/[0-9\.\,\-]/) == null) ) tmpStr += numHan2Zen(srcText[i]);
else tmpStr += srcText[i];
break;
case (srcText.length - 1): // 半角数字が行末にあり、前の文字が数字(ピリオド、カンマ、ハイフンを含む)でない場合
if( (srcText[i].match(/[0-9]/) != null) && (srcText[i-1].match(/[0-9\.\,\-]/) == null) ) tmpStr += numHan2Zen(srcText[i]);
else tmpStr += srcText[i];
break;
default: // 半角数字の前後が数字(ピリオド、カンマ、ハイフンを含む)でない場合
if( (srcText[i].match(/[0-9]/) != null) && (srcText[i-1].match(/[0-9\.\,\-]/) == null) && (srcText[i+1].match(/[0-9\.\,]/) == null) )
tmpStr += numHan2Zen(srcText[i]);
else tmpStr += srcText[i];
break;
}
}
return tmpStr;
}

//
// 半角数字→全角数字変換関数
//
function numHan2Zen(arg) {
var zenkakuZero = "0";
var hankakuZero = "0";
var hankakuNine = "9";

var strTmp = "";
var i;

for(i = 0; i < arg.length; i++) {
if( (arg.charCodeAt(i) >= hankakuZero.charCodeAt(0) ) && (arg.charCodeAt(i) <= hankakuNine.charCodeAt(0) ) )
strTmp += String.fromCharCode(arg.charCodeAt(i) - hankakuZero.charCodeAt(0) + zenkakuZero.charCodeAt(0) );
else
strTmp += arg[i];
}
return strTmp;
}

//
// 全角数字→半角数字変換関数
//
function numZen2Han(arg) {
var zenkakuZero = "0";
var zenkakuNine = "9";

var strTmp = "";
var i;

for(i = 0; i < arg.length; i++) {
if( (arg.charCodeAt(i) >= zenkakuZero.charCodeAt(0) ) && (arg.charCodeAt(i) <= zenkakuNine.charCodeAt(0) ) )
strTmp += (arg.charCodeAt(i) - zenkakuZero.charCodeAt(0) + "");
else
strTmp += arg[i];
}
return strTmp;
}
スポンサーサイト

COMMENTS

COMMENT FORM

TRACKBACK


この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。