簡易数式計算

提供: MeryWiki
移動先: 案内検索

概要[編集]

選択文字列,またはカレント行を計算式として処理し,結果を表示します.

機能[編集]

  • javascript の Math オブジェクトが対応している定数・関数が使用できます.
    (例:pow, PI など)
    Math は省略できます.
  • オプションを設定することで度数表記で記述できます.
    (通常はラジアン指定)

追加の定数[編集]

  • π:円周率(PI のエイリアス)

追加の関数[編集]

  • Hex:引数を 16 進数表記で返す
  • fact: 階乗

オプション[編集]

  • $COPY$:結果をクリップボードにコピー(デフォルトオフ)
  • $DEGREE$:角度を度数で指定する(デフォルトオフ)

履歴[編集]

  • 2013/10/21 初版

コード[編集]

#title="簡易数式計算"
// -----------------------------------------------------------------------------
// 簡易数式計算
// 選択文字列,またはカレント行を数式として処理し,結果を表示します.
// なお実体はただ javascript として実行しているだけです.
//
// (C) ks
// http://merysmacro.seesaa.net/
// -----------------------------------------------------------------------------
 
// =========================================================
// オプション指定
// =========================================================
// 結果をクリップボードにコピー
var $COPY$ = false;
 
// 度数指定
var $DEGREE$ = false;
// =========================================================
 
function Main() {
  // =====================================================
  // 追加の定数
  // =====================================================
  // 円周率を 2 バイト文字にしてみる
  var π = Math.PI;
  // =====================================================
 
  // =====================================================
  // 標準関数の拡張
  // =====================================================
  // 有効桁位置指定版
  var rep = ["ceil", "floor", "round"];
  for (var i=0; i<rep.length; i++) {
    eval("var __$=Math.$;Math.$=function(n,d){return __$(n/Math.pow(10,d||0))*Math.pow(10,d||0)}".replace(/\$/g, rep[i]));
  }
  // 度数表記への置換
  // ついでに結果の補正
  // Math.sin(Math.PI) が 0 にならないって……
  var rep = ["sin", "cos", "tan", "asin", "acos", "atan"];
  if ($DEGREE$) {
    for (var i=0; i<rep.length; i++) {
      eval("var __$=Math.$;Math.$=function(d){return Math.round(__$(d/180*Math.PI), -12)}".replace(/\$/g, rep[i]));
    }
  } else {
    for (var i=0; i<rep.length; i++) {
      eval("var __$=Math.$;Math.$=function(d){return Math.round(__$(d), -12)}".replace(/\$/g, rep[i]));
    }
  }
  // =====================================================
 
  // =====================================================
  // 追加の関数
  // =====================================================
  // 16 進数化
  var Hex = function(d) {
    return "0x" + d.toString(16).toUpperCase();
  }
  // 階乗
  var fact = function(d) {
    var r = 1;
    while (d > 1) {
      r *= d--;
    }
    return r;
  }
  // =====================================================
 
  // 以下実行処理部
  var s = Document.Selection;
  var e = s.Text;
  if (!e) {
    e = Document.GetLine(s.GetActivePointY(mePosLogical), mePosLogical);
  }
  try {
    with (Math) {
      var r = eval(e);
      Status = r;
      if ($COPY$) {
        ClipboardData.SetData(r);
      }
    }
  } catch (e) {
    Status = e.message;
  }
}
 
Main();