数字を全角に変換したいNo.03487
ちゅん さん 02/11/19 15:09
 
日付挿入のマクロを作りたいと思っているんですが、
(”2002年11月19日”のような形式で)
半角数字を全角数字に変換する方法が分かりません。
過去のマクロライブラリにもそういうものは見あたりませんし。

どうぞヒントなどを教えてください。

[ ]
RE:03487 数字を全角に変換したいNo.03488
プックン さん 02/11/19 16:54
 
ちゅんさん、こんにちは

日付情報を全角にしてから、貼り付ける方法が思い浮かばなかったので
貼り付けてから全角にしました。

//sample
$$date = year + "年" +
        month + "月" +
        day + "日";                         //日付情報作成。日付は半角です
##x = x ;                                   //現在の位置x情報取得
##y = y ;                                   //現在の位置y情報取得
##strlen = strlen($$date) ;                 //挿入文字列の長さを取得
insert $$date ;                             //文字列挿入
moveto ##x,##y;                             //挿入した先頭に移動
beginsel ;                                  //範囲選択開始
##movex = ##x + ##strlen ;                  //挿入した文字列の末尾に移動する
情報作成
moveto ##movex,##y;                         //挿入した文字列の末尾に移動
tozenkakuhira ;                             //

[ ]
RE:03487 数字を全角に変換したいNo.03489
ひろ さん 02/11/19 17:15
 
 ちゅんさん今日は、ひろです。
> 日付挿入のマクロを作りたいと思っているんですが、
> (”2002年11月19日”のような形式で)
> 半角数字を全角数字に変換する方法が分かりません。
 日付を挿入するということは、ウィンドウに既に書いて有る文字列を変換する
のではなく、変数に保存した半角文字を全角に変換したいんですよね。
 それならば、次の方法で可能です。(ウィンドウに書かれた文字ならもっと簡単)
//-------------------------------------------------------------------------
call NumberHan2Zen"2002年11月19日";
message $$return;
endmacro;

NumberHan2Zen:
  ##char = '0';
  $$return = $$1;
  while( ##char <= '9' ){
    call ChangeCharacter $$return, char( ##char ), char( ##char + 0x0821F );
    ##char = ##char + 1;
  }
  return $$return;

ChangeCharacter://文字列を置換
  ##change_char=strlen($$2);
  $$string = "";
  while(1){
    ##number = strstr($$1, $$2);
    if(##number == -1)break;
    else{
      ##long = strlen($$1);
      $$string = $$string + leftstr($$1, ##number) + $$3;
      $$1 = rightstr($$1, ##long - ##number - ##change_char);
    }
  }
  return $$string + $$1;

[ ]
RE:03488 数字を全角に変換したいNo.03490
プックン さん 02/11/19 17:16
 
ちゅんさん、こんにちは

ちょっと気分転換に考えてみました。

//sample
//年情報を全角へ
call tozen year;
$$year = $$return ;

//月情報を全角へ
call tozen month;
$$month = $$return ;

//日情報を全角へ
call tozen day;
$$day = $$return ;

//貼り付け情報作成
$$date =    $$year + "年" +                        
            $$month + "月" +        
            $$day + "日";       //日付情報作成。日付は半角です
//貼り付け
insert $$date;
endmacro;

//サブルーチン
tozen:
//引数渡し 第一引数 :文字列型,半角数字
$$str = $$1;
//処理
##strlen = strlen($$str) ;
//変換文字列を用意
$$zen = "0123456789" ;
$$word = "";

##i = 0 ;
while( ##i < ##strlen ) {                           //文字列の数だけ繰り返し
    $$target = midstr($$str,##i,1) ;                //左から1文字づつ処理
    //全角文字列$$zenを使用して、全角化
    //数字の情報$$target×2で$$zenの位置を示し、全角文字列を取得
    $$word = $$word + midstr($$zen,val($$target)*2,2) ;
    ##i = ##i + 1;
}

//引数戻し指定
return $$word ;

[ ]
RE:03490 数字を全角に変換したいNo.03491
プックン さん 02/11/19 18:47
 
ちゅんさん、こんにちは

またまた、考えてみました。
別のプログラムを使用して、実行する方法です。

田楽DLLとBREGEXP.DLLを使用して書いてみました。

秀丸ディレクトリに上記DLLを置いて試して見てください。

・田楽DLL
http://www.ceres.dti.ne.jp/~sugiura/hidemaru/macros/dgserver/
・BREGEXP.DLL
http://www.hi-ho.ne.jp/babaq/bregexp.html

//Sample
call Dengaku ;

if (!dllfunc("BRE_LOAD", hidemarudir + "\\BREGEXP.DLL")) {
    message "BREGEXP.DLL が見つかりません";
    freedll;
    endmacro;
}

$$date = year + "年" +
        month + "月" +
        day + "日" ;
call h2z $$date ;
$$ret = $$return ;

insert $$ret ;

//#r = dllfunc("BRE_FREE"); // 使い終わったら BRE_FREE() で開放
endmacro;

h2z:
//引数渡し
$$str = $$1;
//処理

#step = 0 ;
$$ptn = "s/0/0/g";$$s = dllfuncstr("BRE_SUBST", $$ptn, $$str);if($$s != "")
{$$str = $$s ;}
$$ptn = "s/1/1/g";$$s = dllfuncstr("BRE_SUBST", $$ptn, $$str);if($$s != "")
{$$str = $$s ;}
$$ptn = "s/2/2/g";$$s = dllfuncstr("BRE_SUBST", $$ptn, $$str);if($$s != "")
{$$str = $$s ;}
$$ptn = "s/3/3/g";$$s = dllfuncstr("BRE_SUBST", $$ptn, $$str);if($$s != "")
{$$str = $$s ;}
$$ptn = "s/4/4/g";$$s = dllfuncstr("BRE_SUBST", $$ptn, $$str);if($$s != "")
{$$str = $$s ;}
$$ptn = "s/5/5/g";$$s = dllfuncstr("BRE_SUBST", $$ptn, $$str);if($$s != "")
{$$str = $$s ;}
$$ptn = "s/6/6/g";$$s = dllfuncstr("BRE_SUBST", $$ptn, $$str);if($$s != "")
{$$str = $$s ;}
$$ptn = "s/7/7/g";$$s = dllfuncstr("BRE_SUBST", $$ptn, $$str);if($$s != "")
{$$str = $$s ;}
$$ptn = "s/8/8/g";$$s = dllfuncstr("BRE_SUBST", $$ptn, $$str);if($$s != "")
{$$str = $$s ;}
$$ptn = "s/9/9/g";$$s = dllfuncstr("BRE_SUBST", $$ptn, $$str);if($$s != "")
{$$str = $$s ;}

//引数戻し指定
return $$str ;

Dengaku:
$$info = $$1;
//田楽DLLのロード
loaddll(hidemarudir + "\\DengakuDLL.dll");
if (!result) {
        $$mes = "田楽DLLが見つかりませんでした。\n" +
                "田楽DLLを秀丸インストールディレクトリにおいてください。\n" +
                "  秀丸インストールディレクトリ:\n\t"+hidemarudir + "\n\n" +
                "田楽DLL ダウンロードURL\n"+
                "  http://www.ceres.dti.ne.jp/~sugiura/hidemaru/macros/dgser
ver/\n" +
                $$info ;
message $$mes ;
endmacro;
}

return;

[ ]
RE:03491 数字を全角に変換したいNo.03492
プックン さん 02/11/19 19:17
 
ちゅんさん、こんばんは

またまた、考えてみました。
作業ファイルを使用して、半角から全角に変換してみました。
効率悪いですが、こんな書き方もありかも。

//Sample
//Iniファイルに日付情報を作成する方針

$ini = hidemarudir + "\\" + "h2z.ini";      //Iniファイル名定義
$$date = year + "年" +
        month + "月" +
        day + "日" ;                        //日付情報(半角)

#fh = hidemaruhandle( 0 );                  //ファイルハンドル取得

writeinistr $ini, "HtoZ", "Str", $$date ;   //日付情報をiniファイルにWrite
//INIファイルにデータを書きこむ文です。
//writeinistr INIファイル名, セクション名, キー名, 文字
//writeinistr "HIDEMARU.INI", "Option", "RefMark", ">> ";

//Iniフィアルの文字列を開いて置換する
openfile "/h " +  $ini ;                    //ステルスモードでファイルを開く

#backfh = hidemaruhandle( 0 );              //Iniファイルの
                                            //ファイルハンドル取得
$$num[0] = "0";                            //置換文字列
$$num[1] = "1";
$$num[2] = "2";
$$num[3] = "3";
$$num[4] = "4";
$$num[5] = "5";
$$num[6] = "6";
$$num[7] = "7";
$$num[8] = "8";
$$num[9] = "9";

##loop = 10;                                //置換処理 10回行う
##i = 0 ;
while( ##i < ##loop ) {
                                            //半角数字から全角数字に置換。
                                            //置換は$$numの配列を使用
    replaceallfast str(##i) ,$$num[##i] ;
    ##i = ##i + 1;
}
save;                                       //編集を行ったiniファイルを保存

setactivehidemaru #fh ;                     //元のファイルに移動
closehidemaru #backfh;                      //iniファイルを閉じる

$$str = getinistr($ini,"HtoZ","Str");       //iniファイルから情報取得
insert $$str ;                              //文字列挿入

[ ]
RE:03492 数字を全角に変換したいNo.03493
プックン さん 02/11/19 19:49
 
ちゅんさん、こんばんは

またまたまた....、考えてみました。(ええかげんにせ〜という声が聞こえてきそう
です)

文字コードを使用して処理してみました。

//sample

//年情報を全角へ
call tozen year;
$$year = $$return ;

//月情報を全角へ
call tozen month;
$$month = $$return ;

//日情報を全角へ
call tozen day;
$$day = $$return ;

//貼り付け情報作成
$$date =    $$year + "年" +                        
            $$month + "月" +        
            $$day + "日";       //日付情報作成。日付は半角です
//貼り付け
insert $$date;
endmacro;

tozen:
//引数渡し
$$str = $$1;
//処理
##code = 0x0824f ;//全角0の文字コード

##i = 0;
##strlen = strlen($$str) ;

while( ##i < ##strlen ) {
$$val = midstr($$str,##i,1) ;
//全角文字0から全角数字を作成し、文字列を連結する。
$$word = $$word + char(##code + val($$val)) ;

##i = ##i + 1;
}


//引数戻し指定
return $$word;

[ ]
RE:03493 数字を全角に変換したいNo.03494
ENCODINGSHIFTJIS さん 02/11/20 11:42
 
短い方向でやってみました
1文字刻み処理はスピード低下でエディタマクロぽくありません
ダイハードな言語ではノーマルですが

// YAGNI YAGNI リファクタリング

$$date = year + "年" + month + "月" + day + "日" ;
menu $$date;
#x=x;#y=y;// 位置を記憶
insert $$date;
beginsel;moveto #x,#y;
tozenkakuhira;// エディタ独自操作、好き嫌いの分かれ道
escape;// カーソル位置は何?ですが、そういうのは適当に
//

[ ]
RE:03494 数字を全角に変換したいNo.03498
ENCODINGSHIFTJIS さん 02/11/22 10:23
 
第二解法
//  BREGEXP.DLL の k オプションを見つけられるか?
//Sample
call DandB;

$$date = year + "年" + month + "月" + day + "日" ;

$trstr="tr/0-9/0-9/kg";
$$ret = dllfuncstr("BRE_TRANS",$trstr,$$date);

insert $$ret ;
#r = dllfunc("BRE_FREE"); // 使い終わったら BRE_FREE() で開放
freedll;
endmacro;

DandB:  //  ========================
$$info = $$1;
//田楽DLLのロード
loaddll(hidemarudir + "\\DengakuDLL.dll");
if (!result) {
    $$mes = "田楽DLLが見つかりませんでした。\n" +
        "田楽DLLを秀丸インストールディレクトリにおいてく ださい。\n" +
        "  秀丸インストールディレクトリ:\n\t"+hidemarudir + "\n\n" +
        "田楽DLL ダウンロードURL\n"+
        "  http://www.ceres.dti.ne.jp/~sugiura/hidemaru/ macros/dgserver/\n" +
        $$info ;
message $$mes ;
endmacro;
}

if (!dllfunc("BRE_LOAD", hidemarudir + "\\BREGEXP.DLL")) {
  message "BREGEXP.DLL が見つかりません";
  freedll;
  endmacro;
}

return;


[ ]
RE:03498 数字を全角に変換したいNo.03500
ちゅん さん 02/11/22 14:22
 
プックンさん、ENCODINGSHIFTJISさん、ひろさん
どうもレスありがとうございます。

簡単なものなのかと思ったら、いろんな解法があって、
奥が深いものなんですね。

ちょっと参考にさせて頂いていろいろ勉強してみます。

ありがとうございました。

#レスが遅れてすいませんでした。

[ ]