◀マクロトップへ
  • 158 テキスト電卓+
    • 159 テキスト電卓#2 PerlScript版
    • 164 Re:テキスト電卓+ バージョンアップ
      • 165 Re2:テキスト電卓+ 使い方など
      • 166 Re2:テキスト電卓+ 支援ソフト?
  • [158] テキスト電卓+ りーや 2005年06月21日 14:01

    テキストで書かれた式を計算(評価)して計算結果を貼り付けます。

    選択範囲があればその範囲を、無ければカーソル位置から直前の
    タブか行頭までを選択状態にして、計算対象とします。

    計算結果だけでなく、計算式も残しておきたいときは、右端に =
    を付けます。
    (600+55)*3= → (600+55)*3=1965
    (600+55)*3 → 1965
    という感じです。

    ちょっとした計算をさせたいときに、タブを置いてから
    計算式を入力して利用できます。
    666/32=20.8125 四捨五入 Math.round(666/32)=21
    剰余 10%3=1
    累乗 Math.pow(3,2)=9
    Math.pow(3,0.5)=1.7320508075688772
    ビットシフト 256>>2=64
    位取りのカンマは使えません
    5,500*3=1500
    5と500*3と捕らえて、後の方の結果が返ってきます。
    その他、実はJScriptとして実行結果を返しているだけ
    なので、使える式などはJScriptの入門などを検索・参照
    して下さい。
    ※判らない方は気にしなくて良いですが、数行のJScriptマクロ
     を書いて、結果に置き換えるなんてのも出来るハズです

    // テキスト電卓+
    var i , col , outStr;
    var selStr = Editor.GetSelectedString(0); // 選択文字列を取得
    Editor.MoveHistSet(); // 現在位置を移動履歴に登録
    if(selStr == ""){ // 選択範囲がないなら以下を行なう
    Editor.BeginSelect(); // 範囲選択開始
    Editor.GoLineTop(1); // 行頭に移動(折り返し単位)
    selStr = Editor.GetSelectedString(0); // 選択文字列を取得
    col = selStr.lastIndexOf("\t"); // タブを探して
    if(col > 0) // タブがもしあれば タブの右側まで
    for(i=0; i<=col; i++) Editor.Right(); // カーソル移動
    selStr = Editor.GetSelectedString(0); // 選択文字列の再取得
    }
    try {
    if(selStr.match(/^(.+)=[ \t\r\n]*$/) != null){ // = で終っている
    outStr = eval(RegExp.$1); // ならばその前を評価
    outStr = selStr + outStr; // 式と結果を
    } else { // そうでなければ
    outStr = eval(selStr); // 式を結果で置き換えて
    }
    Editor.InsText(outStr); // 選択範囲部分に貼り付ける
    } catch (error) { // eval のエラーをトラップ?
    var WshShell = new ActiveXObject("WScript.Shell");
    WshShell.Popup(selStr+"\n"+error ,0,"計算式に間違い",0);
    Editor.CancelMode(); // 各種モードの取り消し
    Editor.MoveHistPrev(); // 移動履歴:前へ
    }
    • [159] テキスト電卓#2 PerlScript版 りーや 2005年06月21日 17:30

      PerlScript版です

      使い方など同じですが、ActivePerlを持っている方はこちらをどうぞ
      言語の力の差そのままに強力で少しは自然です。
      演算子や関数はC言語ライクです。

      べき乗 2**0.5=1.4142135623731
      平方根 sqrt(2)=1.4142135623731
      π atan2(1,1) * 4 = 3.14159265358979
      sin(3.14159265358979/180*45)=0.707106781186547
      exp(1)=2.71828182845905
      sprintf("Howdy! World")=Howdy! World

      今ひとつ理解不足のJScriptと違って、evalのエラー
      も捕まえて一応後処理しています。

      -----^ eval.pls ( date:05-06-21 time:17:11 ) -----< cut hear
      # eval.pls
      $selStr = GetSelectedString(0);
      unless($selStr){
      MoveHistSet(); BeginSelect(); GoLineTop(1);
      $selStr = GetSelectedString(0);
      $selStr =~ /^(.+)\t(.*)$/;
      if($2){
      $selStr = $2;
      $preFix = $1 . "\t";
      }
      }
      if($selStr =~ /^(.+)=[ \t\r\n]*$/){
      $outStr = eval $1;
      $outStr = $selStr . $outStr;
      } else {
      $outStr = eval $selStr;
      }
      if($@){
      use Win32::OLE;
      $WshShell = Win32::OLE->CreateObject("WScript.Shell");
      $WshShell->Popup("$selStr\n$@",undef,"Abend",0);
      CancelMode(); MoveHistPrev();
      exit;
      } else {
      InsText($preFix . $outStr);
      }
      -----$ eval.pls ( line:26 charset:ascii) ---------< cut hear
    • [164] Re:テキスト電卓+ バージョンアップ りーや 2005年06月25日 17:11

      早くも大幅に書き直しです。(^^;

      // calcPlus.js -------------
      // テキスト電卓+
      var WshShell = new ActiveXObject("WScript.Shell");
      var outStr="" , calStr="" , preStr="" , postStr="";
      var re = /(abs|acos|asin|atan|atan2|ceil|cos|exp|floor|log|max|min|pow|random|round|sin|s
      qrt|tan)/g;
      var selStr = Editor.GetSelectedString(0); // 選択文字列を取得
      Editor.MoveHistSet(); // 現在位置を移動履歴に登録
      if(selStr == ""){ // 選択範囲がないなら以下を行なう
      Editor.BeginSelect(); // 範囲選択開始
      Editor.GoLineTop(1); // 行頭に移動(折り返し単位)
      selStr = Editor.GetSelectedString(0); // 選択文字列を取得
      selStr.match(/^(.*?)([ %&(-/0-9<>M^a-il-uwx|~゜゜°]+)( *?=? *?)$/);
      preStr = RegExp.$1; // 計算式の前
      calStr = RegExp.$2; // 計算式部分
      postStr = RegExp.$3; // 計算式の後
      if(calStr != ""){ // 計算式と思われるものがあるなら
      selStr = calStr; // selStr は作業用エリアとして利用コピー退避
      } else { // 計算式が見つからないとき(マッチしてない)
      preStr = selStr; // 行が消えないようにすべてを残す
      }
      } else { // 明示的に選択範囲により計算式の指定がある
      calStr = selStr; // ので、そのまま計算式とする。
      }
      if(calStr.match(/Math\./) == null) // Math. が使われてないなら
      calStr = calStr.replace(re, "Math\.$&"); // 算術関数名にMath.付け
      calStr = calStr.replace(/(°|゜|゜)/g, "*3.141592653589793238/180"); // Deg→Rad
      try {
      outStr = eval(calStr); // 式を結果で置き換えて
      if(postStr != "") outStr = selStr + postStr + outStr;
      if(preStr != "") outStr = preStr + outStr;
      Editor.InsText(outStr); // 選択範囲部分に貼り付ける
      try { // 計算式の表示、まさにトライ
      var tryStr = "calcPopup.vbs \"" + selStr + "\""
      eval("WshShell.run(tryStr);");
      } catch (error) {
      // エラーでもスルーする
      }
      } catch (error) { // eval のエラーをトラップ?
      WshShell.Popup(calStr+"\n"+error ,0,"計算式に間違い",0);
      Editor.CancelMode(); // 各種モードの取り消し
      Editor.MoveHistPrev(); // 移動履歴:前へ
      }

      • [165] Re2:テキスト電卓+ 使い方など りーや 2005年06月25日 17:12

        電卓用途に便利にとバージョンアップしました。かなり書き換わってます。
        選択範囲で明示的に式を示すのは優先してますが、もっと手軽に式を打ち込んだところでこのマクロを使えば、出来るだけマクロの方が式の範囲を見つけて計算する。
        また、途中経過を出しながら計算を続けて進めていけるようにしました。

        この下からの各行末にカーソルで試してください
        まずは加減乗除 6 + 4 - 2 * 3 / 6 =
        括弧で計算順を(6 + 4 - 2) * 3 / 6 =
        単価は1440/12
        1440/12=
        1440/12=120*30=
        1440/12=120*30=3600-1500
        十を三で割った余は10%3
        べき乗はpow(2,3)=
        ^はべき乗ではなく論理演算 6^3=
        °(度)や半濁音記号は*π/180でラジアンにtan(45゜) =
        前が半角だと式を誤りエラー表示もThis is 3*2
        そういう場合はタブか=などを式の前にThis is 3*2
        以下の算術関数が使えます。
        abs acos asin atan atan2 ceil cos exp floor
        log max min pow random round sin sqrt tan

      • [166] Re2:テキスト電卓+ 支援ソフト? りーや 2005年06月25日 17:14

        マクロが何を計算式と判断したか、自動で消えるポップアップで表示させたい、と思ったのですがサクラエディタの下では自動で消えてくれないので外だししました。

        以下のVBScriptを calcPopup.vbs という名前でパスの通ったところに置いておくと、計算式が2秒間表示されて自動的に消えます。
        無くても、テキスト電卓+の動きには支障ありません。のハズ

        #ウチの時代遅れノートだと、初回は間の抜けたタイミングの表示で2回目からまとも

        // calcPopup.vbs --------------------
        Dim WshShell, wk
        set args = WScript.Arguments
        set WshShell = WScript.CreateObject("WScript.Shell")
        wk = WshShell.Popup(args(0), 2 ,"計算式")