第11回 文字列の数式を解析して計算する

公開日:2018-07-25

1. 内容

1. 選択した数式を計算する機能の追加

数式を選択して、右クリックメニューの「計算します」をクリックすると、数式を計算して、結果を文字列として挿入します。
double で扱っているため誤差があります。
また、独自の解析方法のため、もっと良いやり方や、不具合がある可能性もございますのでご了承ください。

現在使える演算子と関数は、+、-、/、*、!、π、E(指数表記用)、sin、cos、√(ルート) です。

2. 動画

数式の解析方法の説明

プログラムの説明

3. 補足

今回はあえて独自処理で数式を計算していますが、node.js を使用して、JavaScript を使うと簡単に計算できます。

1. node.js のインストール

node.js の公式サイト にアクセスして、Windows Binary (.zip) をダウンロードして解凍します。
解凍時にファイル名が長すぎてエラーになる場合は、zipのファイル名を短くしてから解凍してください。
解凍すると、node.exe が作成されます。
これを、自分のアプリの exe と同じ場所にコピーしてください。

2. C#側

node.js に、実行する JavaScript のファイル名と、計算する数式を渡します。
C#
private void button1_Click(object sender, EventArgs e)
{
    var formula = "(1+2)*3";    //計算したい数式
    var result = Calc(formula); //計算
    Console.WriteLine(result);  //計算結果の出力
}

private string Calc(string formula) {
    var processStartInfo = new ProcessStartInfo {
        FileName               = "node.exe",
        Arguments              = "calc.js \"" + formula + "\"",
        CreateNoWindow         = true, //画面を非表示にします
        RedirectStandardOutput = true, //戻り値を取得するための設定
        UseShellExecute        = false //戻り値を取得するための設定
    };

    var process = Process.Start(processStartInfo);
    var result = process.StandardOutput.ReadToEnd();
    return result;
}

3. JavaScript側

上記の C# の Calc() を実行すると、calc.js が実行されます。

process.argv[0] には node.exe のフルパス、
process.argv[1] には calc.js のフルパス、
process.argv[2] には 計算する数式が入るので、

eval() に process.argv[2] を渡して計算させます。
calc.js
console.log(eval(process.argv[2]));

4. 画面




5. 今後の課題

1. 見出しリストの表示

テキストの左側に見出しリストを表示して、クリックされたら本文中の見出しのある位置にカーソルを移動できるようにします。

2. 変換機能

10進数・16進数の変換をポップアップメニューで行えるようにする。

3. grep

指定されたキーワードを含むファイルを検索して一覧で表示する。
そして、一覧でダブルクリックされたら、そのファイルを開くようにする。

4. その他

タブ化、操作の記憶と再生、バイナリーファイル対応、ファイルツリー・リストを付けた3ペイン構成にする、プラグインでテキストの加工を行えるようにする、プラグインでカレンダーをつけて日記をつけられるようにする、などなど。

ダウンロード

ver実行ファイルソース
1.0.10
2018/07/25
ncm_1_0_10.zipncm_1_0_10_src.zip