public static float RunFormula(string formula)
{
if (!(formula.Contains("+") || formula.Contains("/") || formula.Contains("*") || formula.Contains("-")))
return float.Parse(formula);
List<int> leftB = new List<int>();
List<int> rightB = new List<int>();
for (int i = 0; i < formula.Length; i++)
{
if (formula[i].ToString().Equals("("))
leftB.Add(i);
else if (formula[i].ToString().Equals(")"))
rightB.Add(i);
}
if (leftB.Count == 0 && rightB.Count == 0)//公式没有括号..进行其他运算
{
List<int> RideOrExcept = new List<int>();
for (int i = 0; i < formula.Length; i++)
{
if (formula[i].ToString().Equals("*") || formula[i].ToString().Equals("/"))
RideOrExcept.Add(i);
}
if (RideOrExcept.Count == 0)//没有乘除,直接算加减
{
string leftNum = string.Empty;
string rightNum = string.Empty;
string symbol = string.Empty;
int leftIndex = -1;
for (int j = 0; j < formula.Length; j++)
{
if (formula[j].ToString().Equals("+") || formula[j].ToString().Equals("-"))
{
if (symbol.Length == 0)//没有拿到运算符
{
symbol = formula[j].ToString();
}
else//第二次拿到运算符
{
if (symbol == "+")
{
string result = (float.Parse(leftNum) + float.Parse(rightNum)).ToString();
formula = formula.Remove(leftIndex, j - leftIndex);
formula = formula.Insert(leftIndex, result);
symbol = string.Empty;
leftIndex = -1;
leftNum = string.Empty;
rightNum = string.Empty;
j = -1;
}
else if (symbol == "-")
{
string result = (float.Parse(leftNum) - float.Parse(rightNum)).ToString();
formula = formula.Remove(leftIndex, j - leftIndex);
formula = formula.Insert(leftIndex, result);
symbol = string.Empty;
leftIndex = -1;
leftNum = string.Empty;
rightNum = string.Empty;
j = -1;
}
}
}
else if (symbol.Length == 0)//没拿到运算符
{
if (leftIndex == -1)
leftIndex = j;
leftNum = leftNum + formula[j];
}
else
{
rightNum = rightNum + formula[j];
}
}
if (symbol == "+")
{
string result = (float.Parse(leftNum) + float.Parse(rightNum)).ToString();
formula = formula.Remove(leftIndex, formula.Length - leftIndex);
formula = formula.Insert(leftIndex, result);
return float.Parse(result);
}
else if (symbol == "-")
{
string result = (float.Parse(leftNum) - float.Parse(rightNum)).ToString();
formula = formula.Remove(leftIndex, formula.Length - leftIndex);
formula = formula.Insert(leftIndex, result);
return float.Parse(result);
}
}
else
{
string leftNum = string.Empty;
string rightNum = string.Empty;
string symbol = string.Empty;
foreach (var item in RideOrExcept)//循环所有运算符进行优先运算
{
for (int offset = -1; ;)
{
int index = item + offset;
if (index >= formula.Length)
{
break;
}
else if (index < 0)
{
offset = 0;
symbol = formula[item].ToString();
}
else if (!(formula[index].ToString().Equals("+") || formula[index].ToString().Equals("/") || formula[index].ToString().Equals("*") || formula[index].ToString().Equals("-")))
{
if (symbol.Length == 0)
leftNum = leftNum.Insert(0, formula[index].ToString());
else
rightNum = rightNum + formula[index].ToString();
}
else
{
if (rightNum.Length == 0)
{
offset = 0;
symbol = formula[item].ToString();
}
else if (symbol == "*")
{
string result = (float.Parse(leftNum) * float.Parse(rightNum)).ToString();
formula = formula.Remove(item - leftNum.Length, item + rightNum.Length + 1);
formula = formula.Insert(item - leftNum.Length, result);
symbol = string.Empty;
return RunFormula(formula);
}
else if (symbol == "/")
{
string result = (float.Parse(leftNum) / float.Parse(rightNum)).ToString();
formula = formula.Remove(item - leftNum.Length, item + rightNum.Length + 1);
formula = formula.Insert(item - leftNum.Length, result);
symbol = string.Empty;
return RunFormula(formula);
}
}
if (symbol.Length == 0)
offset--;
else
offset++;
}
if (symbol == "*")
{
string result = (float.Parse(leftNum) * float.Parse(rightNum)).ToString();
formula = formula.Remove(item - leftNum.Length, leftNum.Length + 1 + rightNum.Length);
formula = formula.Insert(item - leftNum.Length, result);
symbol = string.Empty;
return RunFormula(formula);
}
else if (symbol == "/")
{
string result = (float.Parse(leftNum) / float.Parse(rightNum)).ToString();
formula = formula.Remove(item - leftNum.Length, leftNum.Length + 1 + rightNum.Length);
formula = formula.Insert(item - leftNum.Length, result);
symbol = string.Empty;
return RunFormula(formula);
}
}
return RunFormula(formula);
}
}
else
{
int left = leftB.LastOrDefault() + 1;
int right = rightB.FirstOrDefault();
string f = formula.Substring(left, right - left);
formula = formula.Remove(left - 1, right - left + 2);//左移1位,右移2位去括号
string value = RunFormula(f).ToString();
formula = formula.Insert(left - 1, value);
float result = RunFormula(formula);
return result;
}
return 0;
}
能识别有±*/以及括号的公式进行运算(如公式结果过大会出现异常!)