NCalc 指定类型

use*_*829 6 c# ncalc

我们有一个使用 Ncalc 来计算字符串的通用计算例程。然而,当乘法中的值足够小以至于 Ncalc 将它们视为 int 时,我们会遇到一个问题,但结果对于 int 来说太大了。

例子:

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

这导致负的 int 值。

有没有办法强制 Ncalc 使用 long 进行计算?

我曾尝试使用参数,这有效,但这意味着要对我们的代码进行重大重写才能实现,如果可能的话,我想避免它。

谢谢

Adr*_*tti 4

NCalc 使用Int32整数数据类型,那么您不能强制将数字计算为Int64. 但是,如果您不使用内置数学函数并且依赖于简单的数学运算符,您可以将数字转换为数字long,并且它将调用正确的运算符。让我们来看看它:

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]);
    }
};
Run Code Online (Sandbox Code Playgroud)

请注意,您不能直接将装箱Int32参数转换为,Int64然后必须使用Convert.ToInt64()或双重转换:(long)(int)args.EvaluateParameters()[0]。现在您可以检查结果是否正确:

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

执行正确的类型转换,然后您不需要将两个值都转换为long为.

请注意,您也可以直接使用浮点数(decimal在NCalc中),并且不会出现此类问题:

var expr = new NCalc.Expression("1740263.0 * 1234.0");
Run Code Online (Sandbox Code Playgroud)