提问人:Zacoons 提问时间:9/8/2023 最后编辑:Zacoons 更新时间:9/18/2023 访问量:64
如何使 DataTable.Compute 与不同的 CultureInfos 一起使用
How to make DataTable.Compute work with different CultureInfos
问:
我正在尝试解析一个基本的数学表达式字符串,例如“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 方法来处理不同区域性中的表达式分析,那就太好了。
答:
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
我担心我必须做这样的事情。感谢您的帮助,非常感谢。
评论