首先,我有以下数字,我用字符串转换。
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给了我关于这个语法的更多信息。
答案 0 :(得分:0)
System.Data.DataColumn.Expression
的MSDN文档中描述了Expression Syntax。
您可以在System.Data.DataTable.Compute
的MSDN文档中找到此hint at the bottom of the section remarks。
很高兴知道在表达式语法的文档中的“解析文字表达式”部分中的以下语句。
所有文字表达式必须在不变文化区域设置中表示。当DataSet解析并转换文字表达式时,它总是使用不变文化,而不是当前文化。
所以在我的情况下,我必须将小数numberA
和numberB
转换为以下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。