System.Data.DataTable.Compute中语法的描述

时间:2016-01-26 17:02:03

标签: c# datatable string-formatting

首先,我有以下数字,我用字符串转换。

decimal numberA = 1.0M;
decimal numberB = 2.0M;
string numberAString = numberA.ToString(); // numberAString = 1,0
string numberBString = numberB.ToString(); // numberBString = 2,0

到目前为止,如此优秀ToString()使用当前文化,它位于我的系统de-CH上,小数点分隔符是昏迷状态。

然后我创建一个公式表达式并使用方法System.Data.DataTable.Compute

计算公式
// create formula expression
string formulaExpression = "{0} + {1}";
string formula = string.Format(formulaExpression, numberAString, numberBString); 
// formula = 1,0 + 2,0

// compute formula
object result;
result = new System.Data.DataTable().Compute(formula, filter:string.Empty);

运行此代码时,我得到System.Data.SyntaxErrorException。我认识到,Compute方法不满足于昏迷分隔符。当我使用.ToString(System.Globalization.CultureInfo.InvariantCulture) the culture-independent language转换十进制值时,使用英语,因此使用十进制值的字符串表示的点分隔符,它可以正常工作。

我的问题是,这个语法的名称是什么,我可以在System.Data.DataTable.Compute方法中用作表达式,这个语法在哪里分别描述了允许的运算符和函数? The MSDN Documentation给了我关于这个语法的更多信息。

1 个答案:

答案 0 :(得分:0)

System.Data.DataColumn.Expression的MSDN文档中描述了Expression Syntax

您可以在System.Data.DataTable.Compute的MSDN文档中找到此hint at the bottom of the section remarks

很高兴知道在表达式语法的文档中的“解析文字表达式”部分中的以下语句。

  

所有文字表达式必须在不变文化区域设置中表示。当DataSet解析并转换文字表达式时,它总是使用不变文化,而不是当前文化。

所以在我的情况下,我必须将小数numberAnumberB转换为以下ToString重载,以考虑不变的区域性语言。

string numberAString = numberA.ToString(System.Globalization.CultureInfo.InvariantCulture); 
// numberAString = 1.0
string numberBString = numberB.ToString(System.Globalization.CultureInfo.InvariantCulture); 
// numberBString = 2.0

在我的案例中有点特别的是我在一个已知的Windows 8.1 Bug中运行的情况。由于某种原因,小数分隔符用于文化de-CH昏迷。这是错的。正确将是十进制分隔符的点。有关详细信息,请参阅此Wiki article