怎么讓str=“5+3*2”轉換后成 int=5+3*2
uj5u.com熱心網友回復:
簡單說判斷字符是否數字,數字轉型,字符轉去分支運算uj5u.com熱心網友回復:
假設只按字串順序進行運算,不按運算子優先級舉個栗子
uj5u.com熱心網友回復:
我以前是借助datatable的 來執行運算式。。System.Data.DataTable dt = new System.Data.DataTable();
var Result = dt.Compute("你的字串", "");
uj5u.com熱心網友回復:
推薦你個演算法,運算式樹。因為可能有括號存在。參考這個
using System;
namespace mymathhelper
{
/// <summary>
/// EnumFormula
/// </summary>
public enum EnumFormula
{
Add,//加號
Dec,//減號
Mul,//乘號
Div,//除號
Sin,//正玄
Cos,//余玄
Tan,//正切
ATan,//余切
Sqrt,//平方根
Pow,//求冪
None,//無
}
/// <summary>
/// FormulaDeal
/// </summary>
public class FormulaDeal
{
static FormulaDeal()
{
}
private double CalculateExpress(string strExpression)
{
string strTemp = "";
string strTempB = "";
string strOne = "";
string strTwo = "";
double ReplaceValue = 0;
while (strExpression.IndexOf("+") != -1 || strExpression.IndexOf("-") != -1
|| strExpression.IndexOf("*") != -1 || strExpression.IndexOf("/") != -1)
{
if (strExpression.IndexOf("*") != -1)
{
strTemp = strExpression.Substring(strExpression.IndexOf("*") + 1, strExpression.Length - strExpression.IndexOf("*") - 1);
strTempB = strExpression.Substring(0, strExpression.IndexOf("*"));
strOne = strTempB.Substring(GetPrivorPos(strTempB) + 1, strTempB.Length - GetPrivorPos(strTempB) - 1);
strTwo = strTemp.Substring(0, GetNextPos(strTemp));
ReplaceValue = Convert.ToDouble(GetExpType(strOne)) * Convert.ToDouble(GetExpType(strTwo));
strExpression = strExpression.Replace(strOne + "*" + strTwo, ReplaceValue.ToString());
}
else if (strExpression.IndexOf("/") != -1)
{
strTemp = strExpression.Substring(strExpression.IndexOf("/") + 1, strExpression.Length - strExpression.IndexOf("/") - 1);
strTempB = strExpression.Substring(0, strExpression.IndexOf("/"));
strOne = strTempB.Substring(GetPrivorPos(strTempB) + 1, strTempB.Length - GetPrivorPos(strTempB) - 1);
strTwo = strTemp.Substring(0, GetNextPos(strTemp));
ReplaceValue = Convert.ToDouble(GetExpType(strOne)) / Convert.ToDouble(GetExpType(strTwo));
strExpression = strExpression.Replace(strOne + "/" + strTwo, ReplaceValue.ToString());
}
else if (strExpression.IndexOf("+") != -1)
{
strTemp = strExpression.Substring(strExpression.IndexOf("+") + 1, strExpression.Length - strExpression.IndexOf("+") - 1);
strTempB = strExpression.Substring(0, strExpression.IndexOf("+"));
strOne = strTempB.Substring(GetPrivorPos(strTempB) + 1, strTempB.Length - GetPrivorPos(strTempB) - 1);
strTwo = strTemp.Substring(0, GetNextPos(strTemp));
ReplaceValue = Convert.ToDouble(GetExpType(strOne)) + Convert.ToDouble(GetExpType(strTwo));
strExpression = strExpression.Replace(strOne + "+" + strTwo, ReplaceValue.ToString());
}
else if (strExpression.IndexOf("-") != -1)
{
strTemp = strExpression.Substring(strExpression.IndexOf("-") + 1, strExpression.Length - strExpression.IndexOf("-") - 1);
strTempB = strExpression.Substring(0, strExpression.IndexOf("-"));
strOne = strTempB.Substring(GetPrivorPos(strTempB) + 1, strTempB.Length - GetPrivorPos(strTempB) - 1);
strTwo = strTemp.Substring(0, GetNextPos(strTemp));
ReplaceValue = Convert.ToDouble(GetExpType(strOne)) - Convert.ToDouble(GetExpType(strTwo));
strExpression = strExpression.Replace(strOne + "-" + strTwo, ReplaceValue.ToString());
}
}
return Convert.ToDouble(strExpression);
}
private double CalculateExExpress(string strExpression, EnumFormula ExpressType)
{
double retValue = 0;
switch (ExpressType)
{
case EnumFormula.Sin:
retValue = Math.Sin(Convert.ToDouble(strExpression));
break;
case EnumFormula.Cos:
retValue = Math.Cos(Convert.ToDouble(strExpression));
break;
case EnumFormula.Tan:
retValue = Math.Tan(Convert.ToDouble(strExpression));
break;
case EnumFormula.ATan:
retValue = Math.Atan(Convert.ToDouble(strExpression));
break;
case EnumFormula.Sqrt:
retValue = Math.Sqrt(Convert.ToDouble(strExpression));
break;
case EnumFormula.Pow:
retValue = Math.Pow(Convert.ToDouble(strExpression), 2);
break;
}
if (retValue == 0) return Convert.ToDouble(strExpression);
return retValue;
}
private int GetNextPos(string strExpression)
{
int[] ExpPos = new int[4];
ExpPos[0] = strExpression.IndexOf("+");
ExpPos[1] = strExpression.IndexOf("-");
ExpPos[2] = strExpression.IndexOf("*");
ExpPos[3] = strExpression.IndexOf("/");
int tmpMin = strExpression.Length;
for (int count = 1; count <= ExpPos.Length; count++)
{
if (tmpMin > ExpPos[count - 1] && ExpPos[count - 1] != -1)
{
tmpMin = ExpPos[count - 1];
}
}
return tmpMin;
}
private int GetPrivorPos(string strExpression)
{
int[] ExpPos = new int[4];
ExpPos[0] = strExpression.LastIndexOf("+");
ExpPos[1] = strExpression.LastIndexOf("-");
ExpPos[2] = strExpression.LastIndexOf("*");
ExpPos[3] = strExpression.LastIndexOf("/");
int tmpMax = -1;
for (int count = 1; count <= ExpPos.Length; count++)
{
if (tmpMax < ExpPos[count - 1] && ExpPos[count - 1] != -1)
{
tmpMax = ExpPos[count - 1];
}
}
return tmpMax;
}
public string SpiltExpression(string strExpression)
{
string strTemp = "";
string strExp = "";
while (strExpression.IndexOf("(") != -1)
{
strTemp = strExpression.Substring(strExpression.LastIndexOf("(") + 1, strExpression.Length - strExpression.LastIndexOf("(") - 1);
strExp = strTemp.Substring(0, strTemp.IndexOf(")"));
strExpression = strExpression.Replace("(" + strExp + ")", CalculateExpress(strExp).ToString());
}
if (strExpression.IndexOf("+") != -1 || strExpression.IndexOf("-") != -1
|| strExpression.IndexOf("*") != -1 || strExpression.IndexOf("/") != -1)
{
strExpression = CalculateExpress(strExpression).ToString();
}
return strExpression;
}
private string GetExpType(string strExpression)
{
strExpression = strExpression.ToUpper();
if (strExpression.IndexOf("SIN") != -1)
{
return CalculateExExpress(strExpression.Substring(strExpression.IndexOf("N") + 1, strExpression.Length - 1 - strExpression.IndexOf("N")), EnumFormula.Sin).ToString();
}
if (strExpression.IndexOf("COS") != -1)
{
return CalculateExExpress(strExpression.Substring(strExpression.IndexOf("S") + 1, strExpression.Length - 1 - strExpression.IndexOf("S")), EnumFormula.Cos).ToString();
}
if (strExpression.IndexOf("TAN") != -1)
{
return CalculateExExpress(strExpression.Substring(strExpression.IndexOf("N") + 1, strExpression.Length - 1 - strExpression.IndexOf("N")), EnumFormula.Tan).ToString();
}
if (strExpression.IndexOf("ATAN") != -1)
{
return CalculateExExpress(strExpression.Substring(strExpression.IndexOf("N") + 1, strExpression.Length - 1 - strExpression.IndexOf("N")), EnumFormula.ATan).ToString();
}
if (strExpression.IndexOf("SQRT") != -1)
{
return CalculateExExpress(strExpression.Substring(strExpression.IndexOf("T") + 1, strExpression.Length - 1 - strExpression.IndexOf("T")), EnumFormula.Sqrt).ToString();
}
if (strExpression.IndexOf("POW") != -1)
{
return CalculateExExpress(strExpression.Substring(strExpression.IndexOf("W") + 1, strExpression.Length - 1 - strExpression.IndexOf("W")), EnumFormula.Pow).ToString();
}
return strExpression;
}
}
}
uj5u.com熱心網友回復:
依稀記得算術運算中應該使用{花括號}[方括號](圓括號)這樣的優先級,如果是字串的運算式是可以包括花括號的,計算器只使用了圓括號。uj5u.com熱心網友回復:
public class Calculator
{
public Calculator()
{
_OptStack = new Stack<char>();
_SuffixStack = new Stack<float>();
}
private Stack<char> _OptStack;
private Stack<float> _SuffixStack;
public float Calculate(string expression)
{
string lastNum = string.Empty;
for (int i = 0; i < expression.Length; i++)
{
if (char.IsNumber(expression[i]) || expression[i].Equals('.'))
{
lastNum += expression[i];
}
else
{
if (lastNum != string.Empty)
{
Merger(float.Parse(lastNum));
lastNum = string.Empty;
}
AddOpt(expression[i]);
}
}
if (lastNum != string.Empty)
{
Merger(float.Parse(lastNum));
}
while (_OptStack.Count > 0)
{
Merger(_OptStack.Pop());
}
return _SuffixStack.Pop();
}
private void AddOpt(char opt)
{
if (_OptStack.Count == 0)
{
_OptStack.Push(opt);
return;
}
if (opt.Equals(')'))
{
while (!_OptStack.Peek().Equals('('))
{
Merger(_OptStack.Pop());
}
_OptStack.Pop();
return;
}
char tempOpt = _OptStack.Peek();
if ((opt.Equals('-') || opt.Equals('+')) &&
(tempOpt.Equals('*') || tempOpt.Equals('/')))
{
while (_OptStack.Count > 0)
{
Merger(_OptStack.Pop());
}
}
_OptStack.Push(opt);
}
private void Merger(float exp)
{
_SuffixStack.Push(exp);
}
private void Merger(char exp)
{
float num1 = _SuffixStack.Pop();
float num2 = _SuffixStack.Pop();
float result = 0;
switch (exp)
{
case '+':
result = num2 + num1;
break;
case '-':
result = num2 - num1;
break;
case '*':
result = num2 * num1;
break;
case '/':
result = num2 / num1;
break;
}
_SuffixStack.Push(result);
}
}
string calc = "89+(126/2)*3-6/3+(96+3-8/2)";// 隨便寫四則運算
Calculator calculator = new Calculator();
MessageBox.Show(calculator.Calculate(calc).ToString()); // 結果
uj5u.com熱心網友回復:
那么考慮到優先級你會怎么做?uj5u.com熱心網友回復:
樓上2位已給出比較經典的表達樹,我則可能另類思路實作,包括括號優先級,運算子優先級,依然還用我寫的順序運算代碼,可以實作不?
uj5u.com熱心網友回復:
可能沒說清楚,其實用的lua撰寫,其他的就不符合我的需求,你這個比較符合。
uj5u.com熱心網友回復:
public void TexT()
{
string str = "5+3*2";
int strInt = (int)new System.Data.DataTable().Compute(str, "");
}
uj5u.com熱心網友回復:
其他都是比較複雜,10樓比較簡單uj5u.com熱心網友回復:
如果只是包含+ - * / 之類的,這個直接拆開,保存就算就行了uj5u.com熱心網友回復:
可能沒說清楚,其實用的lua撰寫,其他的就不符合我的需求,你這個比較符合。
無心插柳uj5u.com熱心網友回復:
Microsoft.JScript.Vsa.VsaEngine ve = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
return Microsoft.JScript.Eval.JScriptEvaluate(sExpression, ve);
uj5u.com熱心網友回復:
直接convert 轉換行不行?
uj5u.com熱心網友回復:
啥語言的?得知道啥語言才能給改uj5u.com熱心網友回復:
我以前是借助datatable的 來執行運算式。。
System.Data.DataTable dt = new System.Data.DataTable();
var Result = dt.Compute("你的字串", "");
這樣報錯啊,怎么解決uj5u.com熱心網友回復:
lua腳本語言uj5u.com熱心網友回復:
lua語言 啥語言的?得知道啥語言才能給改uj5u.com熱心網友回復:
'5+3*2'-'0'轉載請註明出處,本文鏈接:https://www.uj5u.com/net/132239.html
標籤:C#

直接convert 轉換行不行?