2016-03-30 12 views
4

Ncalcを使用して文字列を評価する一般的な計算ルーチンがあります。しかし、私たちは、乗算の値がNcalcがintと見なすほど小さいが、結果がintのために大きすぎる場合に問題を横断しています。NCalc指定タイプ

例:

 var expr = new NCalc.Expression("1740263 * 1234"); 
     object result = expr.Evaluate(); 
     Console.WriteLine(result.ToString()); 
     Console.ReadKey(); 

これは、負の整数値になります。

Ncalcを計算に長く使用する方法はありますか?

私はパラメータを使用しようとしましたが、これは動作しますが、実装するために私たちのコードを大幅に書き直すことを意味し、可能ならば避けたいと思います。

おかげ

答えて

2

NCalcは、あなたがInt64のように計算される数を強制することはできません整数データ型としてInt32を使用しています。しかし、組み込み数学関数を使用せず、普通の算術演算子を使用する場合は、数字をlongに変換し、正しい演算子を呼び出すことができます。のは、それを見てみましょう:(long)(int)args.EvaluateParameters()[0]

var expr = new NCalc.Expression("CLng(1740263) * 1234"); 
expr.EvaluateFunction += delegate(string name, NCalc.FunctionArgs args) 
{ 
    // Nostalgic CLng function... 
    if (String.Equals(name, "CLng", StringComparison.CurrentCultureIgnoreCase)) 
    { 
     args.HasResult = true; 
     args.Result = Convert.ToInt64(args.EvaluateParameters()[0]); 
    } 
}; 

、あなたはConvert.ToInt64()またはダブルキャストを使用する必要がありますが、直接Int64に箱入りInt32パラメータをキャストすることはできませんのでご注意ください。今、あなたは結果を確認することができますが正しいです:

var result = expr.Evaluate(); 
Console.WriteLine("Result is: {0} (type {1})", 
    result, result.GetType()); 

適切な型変換が行われ、その後、あなたはlongキャスト両方の値にする必要はありません。

あなたが直接(NCalcでdecimal)を浮動小数点数を使用することができ、あなたがこのような問題を持っていません注:

var expr = new NCalc.Expression("1740263.0 * 1234.0"); 
+0

ご協力ありがとうございます。それはたくさんの助けになりました。 – user2380829

0

あなたがそれらを交換、文字列からすべての番号を抽出するために正規表現を使用することができますパラメータを使用して、変換された数値にパラメータを設定します。この例では、整数を10進数に置き換えています。

string myCalculationString = "1000000 * 10000000"; 
striny myPattern = @"-?\d+(,\d+)*(\.\d+(e\d+)?)?"; 

MatchCollection matches = 
Regex.Matches(convertedCalculation, myPattern); 

int matchCount = 0; 
convertedCalculation = Regex.Replace(convertedCalculation, 
myPattern , m => "[p" + matchCount++ + "]"); 

for (int i = 0; i < matches.Count; i++) 
    { 
     Match match = matches[i]; 
     decimal number = Convert.ToDecimal(match.Value); 
     expression.Parameters.Add($"p{i}", number); 
    } 

decimal result = (decimal)expression.Evaluate(); 

注私はよく、正規表現をテストしていませんが、正/負の数のために働くようだとオプションの小数点を可能にします。数値または結果のいずれかが10進数の範囲外にある場合は、これもエラーになります

関連する問題