2

我正在尝试评估一个数学字符串并用谷歌搜索了很多。我找到了一个代码片段,但对我不起作用。这是代码

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))作为字符串传递并抛出

表达式有语法错误

第二行的例外。

你认为问题是什么?谢谢

4

6 回答 6

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(),并且效果很好

于 2013-10-21T18:59:36.457 回答
3

您需要使用.而不是,( :=((159.00)*(1.0))

哦,在一个侧节点上:

您需要调用DataTable.compute()来调用表达式的评估:

 static decimal evaluate(string expression)
 {
    var loDataTable = new DataTable();
    return (decimal)(loDataTable.Compute(expression, ""));
 }
于 2013-10-21T18:54:15.087 回答
2

首先,我想也许您需要设置文化,使其,不希望.作为小数分隔符。

但从这里:http: //msdn.microsoft.com/en-us/library/system.data.datacolumn.expression.aspx

所有文字表达式必须在不变的文化语言环境中表达。当 DataSet 解析和转换文字表达式时,它总是使用不变的文化,而不是当前的文化。

所以,你必须转换,但它可能不像,->那样简单.,你的文化中有千位分隔符吗?这也需要改变。

于 2013-10-21T19:03:28.290 回答
1

您应该使用点而不是逗号:

expression.Replace(",",".")
于 2013-10-21T18:57:42.217 回答
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(",",".")
于 2014-08-15T11:52:52.787 回答
1

实际上,您可以根据文化解析为小数。这样,您就不需要所有替换逗号和空格。我相信你是土耳其人?那么下面的行将满足您的需求。

decimal d = decimal.Parse(input, new CultureInfo("tr"));
于 2014-08-15T13:54:40.320 回答