C#评估字符串不起作用

时间:2013-10-21 18:51:08

标签: c# math evaluate

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

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

  

表达式有语法错误

第二行的例外。

您认为问题是什么?感谢

6 个答案:

答案 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"));