我正在尝试评估一个数学字符串并搜索了很多。我找到了一个代码片段,但对我不起作用。这是代码
static decimal evaluate(string expression)
{
var loDataTable = new DataTable();
// ******* throws "The expression has a syntax error" message ******
var loDataColumn = new DataColumn("Eval", typeof(double), expression);
loDataTable.Columns.Add(loDataColumn);
loDataTable.Rows.Add(0);
return (decimal)(loDataTable.Rows[0]["Eval"]);
}
我将((159,00)*(1,0))
作为字符串传递并抛出
表达式有语法错误
第二行的例外。
您认为问题是什么?感谢
答案 0 :(得分:4)
试试这个:
public static void Main()
{
string expression = "((159,00)*(1,0))";
decimal result = evaluate(expression.Replace(".","").Replace(",","."));
}
static decimal evaluate(string expression)
{
var loDataTable = new DataTable();
var loDataColumn = new DataColumn("Eval", typeof(double), expression);
loDataTable.Columns.Add(loDataColumn);
loDataTable.Rows.Add(0);
return decimal.Parse(loDataTable.Rows[0]["Eval"].ToString());
}
据我所知,欧洲符号,逗号和句号都会被切换。因此,首先删除所有句点,然后使用以下句号替换逗号:
expression.Replace(".","").Replace(",",".")
(确保像((159.162,00)*(2,0))
这样的字符串不会中断)
另外,请注意,返回值更改为decimal.Parse(),并且效果很好
答案 1 :(得分:3)
您需要使用.
代替,
(:= ((159.00)*(1.0))
哦,在一个侧节点上:
您需要调用DataTable.compute()
来调用表达式的评估:
static decimal evaluate(string expression)
{
var loDataTable = new DataTable();
return (decimal)(loDataTable.Compute(expression, ""));
}
答案 2 :(得分:2)
首先我想也许您需要设置文化,以便{(1}}而不是,
作为小数点分隔符。
但是从这里开始:http://msdn.microsoft.com/en-us/library/system.data.datacolumn.expression.aspx
所有文字表达式必须在不变文化区域设置中表示。当DataSet解析并转换文字表达式时,它总是使用不变文化,而不是当前文化。
所以,你必须转换,但它可能不像.
- > ,
那么简单,你在文化中有多少分隔符吗?这也需要改变。
答案 3 :(得分:1)
您应该使用点而不是逗号:
expression.Replace(",",".")
答案 4 :(得分:1)
也许你可以使用/开发像这样的解析器
string m_str = "((159,00)*(1,0))";
List<string> m_newList = new List<string>();
for (int i = 0; i < m_str.Length; i++)
{
if (m_str[i].ToString() == ",")
{
m_newList.Add(".");
}
else
{
m_newList.Add(m_str[i].ToString());
}
}
或使用以下代码,如您在此页面中多次看到的那样。
expression.Replace(",",".")
答案 5 :(得分:1)
实际上,您可以解析依赖于文化的小数。这样,您不需要所有替换逗号和空格。 我相信你是土耳其人?然后下面的行将满足您的需求。
decimal d = decimal.Parse(input, new CultureInfo("tr"));