如何使 DataTable.Compute 与不同的 CultureInfos 一起使用

How to make DataTable.Compute work with different CultureInfos

提问人:Zacoons 提问时间:9/8/2023 最后编辑:Zacoons 更新时间:9/18/2023 访问量:64

问:

我正在尝试解析一个基本的数学表达式字符串,例如“2+2”,以便用户可以将表达式放入数字框中。

这是我的代码

var table = new DataTable();
table.Locale = culture;
var result = table.Compute(expression, null);
value = (double)Convert.ChangeType(result, typeof(double), culture);

当我的文化是“en”时,这很有效。如果我将“2+0.2”放入数字框中,代码将输出为双精度。2.2

但是,当我的区域性类似于“es-ES”时,它使用逗号表示小数,代码不起作用。如果我的表达式是“2+0,2”,它会抛出 SyntaxErrorException。

状态更新:

我已经实施了 Darren Lee 的解决方法,但它并不理想。如果有一些内置的 .NET 方法来处理不同区域性中的表达式分析,那就太好了。

C# .NET 分析 数据表 CultureInfo

评论

2赞 ASh 9/8/2023
learn.microsoft.com/en-us/dotnet/api/......
1赞 darrenleeyx 9/8/2023
所有文本表达式都必须在固定区域性区域设置中表示。摘自 ASh 分享的上述链接

答:

3赞 darrenleeyx 9/8/2023 #1

编辑答案:

var result = table.Compute(expression, null);

传入的表达式必须以固定区域性区域设置表示。https://learn.microsoft.com/en-us/dotnet/api/system.data.datacolumn.expression?view=net-7.0#parsing-literal-expressions

您可以做的是手动将表达式解析为固定区域性区域设置(如果确实必须)

实现(你可能应该彻底测试一下,因为我马上就写了):

    public static class Expression
    {
        private static char[] operators = new char[] { '+', '-', '*', '/', '%' };
        public static string Parse(string input, CultureInfo cultureInfo)
        {
            var output = string.Empty;

            // find out the operators used in your raw expression
            // this is to reconstruct the output later
            var operatorsUsed = new List<char>();
            foreach (var c in input)
            {
               if (operators.Contains(c))
                {
                    operatorsUsed.Add(c);
                } 
            }

            var numbers = input.Split(operators);
            foreach (var number in numbers)
            {
                // parse your numbers to invariant culture locale
                output += double.Parse(number, cultureInfo).ToString();

                if (operatorsUsed.Count > 0)
                {
                    // add in the respective operator
                    output += operatorsUsed[0];
                    operatorsUsed.RemoveAt(0);
                }
            }

            return output;
        }
    }

用法:

    var table = new DataTable();
    table.Locale = new CultureInfo("es-ES");
    var result = table.Compute(Expression.Parse("2+0,2", table.Locale), null); //2.2

原答案:

我认为逗号在表达式中是无效的。不确定这是否对您有所帮助,但它得到了预期的结果。

    var table = new DataTable();
    table.Locale = new CultureInfo("es-ES");
    table.Columns.Add("x", typeof(double));
    table.Columns.Add("y", typeof(double));
    table.Columns.Add("result", typeof(double), "x + y");

    table.Rows.Add("2", "0,2");
    var result = table.Rows[0][2]; //2.2

评论

0赞 Zacoons 9/18/2023
我担心我必须做这样的事情。感谢您的帮助,非常感谢。