我最近发现了一种使用数据表对象的compute方法在C#中计算表达式的方法。这是一段代码:
string expression = "330200000*450000";
var loDataTable = new DataTable();
var loDataColumn = new DataColumn("Eval", typeof(double), expression);
loDataTable.Columns.Add(loDataColumn);
loDataTable.Rows.Add(0);
MessageBox.Show(((double)(loDataTable.Rows[0]["Eval"])).ToString());
如果你输入一个简单的表达式,如" 300 * 2"这将工作,但返回大量的表达式将无法正常工作,我收到消息:
"对于Type' Int32',价值太大或太小。"
我试图强制该类型加倍,但由于某种原因,错误仍然指向Int32类型的东西,我不知道它来自何处。
有点牵着那个?
答案 0 :(得分:4)
追加" .0"等式中的值:
string expression = "330200000.0*450000.0";
如果正如你所说的那样,用户已按原样输入等式(即没有" .0"),那么你可能不得不进行一些模糊不愉快的字符串操作来实现这一点。我想出了以下内容,但我确信它可以做得更好:
string expression = "330200000*450000"; // or whatever your user has entered
expression = Regex.Replace(
expression,
@"\d+(\.\d+)?",
m => {
var x = m.ToString();
return x.Contains(".") ? x : string.Format("{0}.0", x);
}
);
var loDataTable = new DataTable();
var computedValue = loDataTable.Compute(expression, string.Empty);
正则表达式试图说明您的用户是否已在其等式中的任何数字的末尾添加小数。
答案 1 :(得分:0)
string expression = "-2+4.00*0.20+3.000/06";
char[] separators = new char[4] { '+', '-', '*', '/' };
string[] numbers = expression.Split(separators, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < numbers.Length; i++)
{
Regex r1 = new Regex(numbers[i]);
expression = r1.Replace(expression, "X", 1);
}
for (int i = 0; i < numbers.Length; i++)
{
decimal d = Convert.ToDecimal(numbers[i]);
numbers[i] = d.ToString("0.####");//# 0-28
if (!numbers[i].Contains(".")) numbers[i] += ".0";
}
for (int i = 0; i < numbers.Length; i++)
{
Regex r2 = new Regex("X");
expression = r2.Replace(expression, numbers[i], 1);
}
if (expression.Contains("/0.0")) return;
decimal dec = Convert.ToDecimal(new DataTable().Compute(expression, ""));
result = dec.ToString("0.####");//# 0-28