Top > プログラミング > .NET Tips> 文字列の計算式の計算結果を取得する

文字列の計算式の計算結果を取得する」への評価、コメント

評価

良い / 悪い = 32 / 3 (「良い」の割合 = 0.914 , 人気度 = 1.411

評価する

コメント一覧


通常のコメント
m 2022/02/9 (Wed) 14:33:42
以前にコメントを書かせて頂いたmXParserの内容を訂正致します。
mXParserでは大量のレコードでメモリリークのような現象が発生しました。

DataTableで10万レコードの計算処理をしたところ2秒かからなかったため、かなり優秀でした。

DataTableで計算する場合、式文字列は不正だと例外が発生するので、とりあえずtry catch内で実施しました。
ただし、式文字列は不正なものを渡さないようにする必要はあります。

また、Computeの結果はobjectで受け、数字にするにはdecimal.TryParseをして変換する必要があります。

式とそのパラメータは動的な場合が多いですが、それは自力で置換する必要があります。

---
decimal[] array = new decimal[100000];

DataTable dataTable = new DataTable();
object? result = null;

for (int k = 0; k < 100000; k++) {
result = null;
decimal value = 0;

// 式文字列
string expressionString = (k + 1).ToString() + "+1.1";

// dataTable.Computeのみtry catchで実施
try {
result = dataTable.Compute(expressionString, "");
} catch (Exception e) {
Console.WriteLine(e);
}

if (result != null) {
decimal.TryParse(result.ToString(), out value);
}

array[k] = value;
}
---

通常のコメント
m 2022/01/23 (Sun) 09:45:04
こちらの情報は古いかもしれませんのでコメントに記載させて頂きます。

NCalcとDataTableを試してみましたが、使い物になりませんでした。
まず、NCalcは更新が止まっていて、それを引き継いだ人のプロジェクトがありましたが、NCalcは自分でDLL化して参照しないといけなかったです。

また、2つともDoubleに変換するのにparseしないといけないです。
不正な場合は例外が発生してしまいます。

ここにはないですが、mXParserが一番優秀なパーサーでした。

mXParser
http://mathparser.org/

書き方が少し複雑ですが、parseの問題がなく、つねにDoubleで取得できることと、不正な場合はNaNになります。

通常のコメント
stiffels 2015/11/9 (Mon) 21:20:20
自作の計算式実行クラスを置いておきます。
http://pastie.org/10540605
http://pastebin.com/wLjD7RjB
リンク切れ対策。どちらも内容は同じ

通常のコメント
MaT 2015/11/8 (Sun) 11:03:57
いつもお世話になっています。
DataTable.Compute がお手軽なんですが、つかえる演算子、関数が限られているんですね。
http://point56.blogspot.jp/2008/03/vbdatatableselect.html

通常のコメント
2014/03/23 (Sun) 19:30:53
すみませんとんでもない勘違いでした
math関数部分は元々自前で計算してました
jscriptの中で出来るわけないですよね(^^;

通常のコメント
2014/03/23 (Sun) 16:21:17
試してみたけど詰んでますねえ…
JScriptCodeProviderは参照が無いと言われCSharpCodeProviderは問題ありそうなので試してないですが
Microsoft Script Controlは関数がかなり足りなくて(POWとかACOSとか)
DataTable.Computeも全然関数無くて…
Mathの関数諦めればいけるんですけど…
(VSAは出来たんですけど)

通常のコメント
2014/03/23 (Sun) 15:01:54
DataTable.Computeを使う方法ではCOS等の関数が使えませんでした
(VSAなら出来たんですけど古い方法だとか文句つけられるし…)
全部試してみるしかないか…

通常のコメント
しゅいろ 2013/06/8 (Sat) 11:50:03
とても役に立ちました。

通常のコメント
匿名 2013/01/9 (Wed) 22:33:25
「Visual C# による文字列処理入門」がリンク切れです。http://msdn.microsoft.com/ja-jp/cc998600.aspx に移ったようです。

評価の理由
takuaki 2012/03/27 (Tue) 15:01:30
評価:良い
助かりました、以前も参照させてもらいました。ありがとうございます。

評価の理由
raki- 2011/09/13 (Tue) 10:25:23
評価:良い
Microsoft Script Controlを使用した方法をVB2008で
動作を確認できました。
非常にうれしいです。

評価の理由
hohoho 2010/09/30 (Thu) 18:10:57
評価:良い
MSDN Japanの「アルゴリズム入門:第1章 Visual C# による文字列処理入門」のものを動かしましたが、最初にカッコがあると(?)うまく動きませんね。
(1+1)*2 って入れるとそのまま計算式が出てきます。
そのうち解析してみますが。

通常のコメント
using System; 2010/08/14 (Sat) 20:52:56
間違えました。すいません。

通常のコメント
using System; 2010/08/14 (Sat) 19:54:55
Microsoft Visual Studio 2010では使えなかった

評価の理由
匿名希望 2010/06/10 (Thu) 11:23:42
評価:良い
正にこれを知りたかった!
ありがとうございます!!

評価の理由
pokey 2009/01/23 (Fri) 16:32:55
評価:良い
このことが知りたかったので助かりました。

通常のコメント
庄子 2009/01/14 (Wed) 14:48:57
EXCL.Worksheets.Application.Cells( , ).formula 
に文字式を代入すれば・・・・
変数を含む場合には変数をセル位置に置き換えたエクセル用の「式」に変換して計算しています。

通常のコメント
memo77 2007/06/14 (Thu) 16:49:05
ああ・・・違った。私がコピペするときに間違えただけでした。恥ずかしい。すみませんでした。

通常のコメント
memo77 2007/06/14 (Thu) 16:38:02
「Microsoft Script Controlを使用した方法」のソースがVB.netとC#で逆になってます。

評価の理由
匿名 2006/07/15 (Sat) 06:50:50
評価:良い
簡単に方法が見つかってよかった!ありがとうございます

評価の理由
km 2006/07/13 (Thu) 15:41:00
評価:良い
まさにこの情報を探していたため。

コメントの投稿

[説明]