首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NCalc指定类型

NCalc指定类型
EN

Stack Overflow用户
提问于 2016-03-30 08:14:48
回答 2查看 2.6K关注 0票数 6

我们有一个使用Ncalc计算字符串的通用计算例程。然而,当乘法中的值足够小时,Ncalc将它们看作int,则结果对于int太大时,我们就遇到了一个问题。

示例:

代码语言:javascript
复制
        var expr = new NCalc.Expression("1740263 * 1234");
        object result = expr.Evaluate();
        Console.WriteLine(result.ToString());
        Console.ReadKey();

这将导致负int值。

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

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

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-30 08:35:35

NCalc使用Int32作为整数数据类型,因此不能强制将数字计算为Int64。但是,如果您不使用内置的数学函数,并且依赖于普通的数学运算符,则可以将一个数字转换为long,它将调用正确的运算符。让我们看看:

代码语言:javascript
复制
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]);
    }
};

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

代码语言:javascript
复制
var result = expr.Evaluate();
Console.WriteLine("Result is: {0} (type {1})",
    result, result.GetType());

执行适当的类型转换,就不需要将两个值都转换为long

请注意,您也可以直接使用浮点数(decimal in NCalc),并且不会遇到这样的问题:

代码语言:javascript
复制
var expr = new NCalc.Expression("1740263.0 * 1234.0");
票数 4
EN

Stack Overflow用户

发布于 2016-07-01 09:50:58

可以使用regex从字符串中提取所有数字,用参数替换它们,然后将参数设置为转换的数字。在本例中,我将整数替换为十进制。

代码语言:javascript
复制
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();

注意,我还没有很好地测试正则表达式,但是它似乎适用于正负数,并且允许可选的小数点。如果任何数字或结果超出了十进制的范围,这也会引发错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36303206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档