Algoritam je onakav kakav sam i opisao, dakle, ne vraćaju se stringovi već brojevi (npr decimal) i relativno je lako implementirati ga i razumeti ga...
Prvobitno nisam stavio kod, ne bi bilo interesantno, a i nisam imao vremena da ga napišem.
Sada sam imao vremena pa sam napisao dve varijante Eval funkcije,
Eval2 funkicja je ono što tebi verovatno treba, onako kako bi čovek računao...
Code:
public static decimal Eval1(string Expression)
{
// Check empty
if (string.IsNullOrEmpty(Expression)) return 0;
// Match + or - operator (add or subtract)
var FIA = Expression.IndexOf('+') ;
var FIS = Expression.IndexOf('-');
if (FIA >= 0 && (FIS < 0 || FIS > FIA))
{
var Left = Expression.Substring(0, FIA);
var Right = Expression.Substring(FIA + 1);
return Eval1(Left) + Eval1(Right);
}
if (FIS >= 0)
{
var Left = Expression.Substring(0, FIS);
var Right = Expression.Substring(FIS + 1);
return Eval1(Left) - Eval1(Right);
}
// Match * or / operator (mutiply or divide)
var FIM = Expression.IndexOf('*');
var FID = Expression.IndexOf('/');
if (FIM >= 0 && (FID < 0 || FID > FIM))
{
var Left = Expression.Substring(0, FIM);
var Right = Expression.Substring(FIM + 1);
return Eval1(Left) * Eval1(Right);
}
if (FID >= 0)
{
var Left = Expression.Substring(0, FID);
var Right = Expression.Substring(FID + 1);
return Eval1(Left) / Eval1(Right);
}
// Decimal constant
return decimal.Parse(Expression);
}
public static decimal Eval2(string Expression)
{
// Check empty
if (string.IsNullOrEmpty(Expression)) return 0;
// Match + or - operator (add or subtract)
var FIA = Expression.LastIndexOf('+') ;
var FIS = Expression.LastIndexOf('-');
if (FIA >= 0 && FIA > FIS)
{
var Left = Expression.Substring(0, FIA);
var Right = Expression.Substring(FIA + 1);
return Eval2(Left) + Eval2(Right);
}
if (FIS >= 0)
{
var Left = Expression.Substring(0, FIS);
var Right = Expression.Substring(FIS + 1);
return Eval2(Left) - Eval2(Right);
}
// Match * or / operator (mutiply or divide)
var FIM = Expression.LastIndexOf('*');
var FID = Expression.LastIndexOf('/');
if (FIM >= 0 && FIM > FID)
{
var Left = Expression.Substring(0, FIM);
var Right = Expression.Substring(FIM + 1);
return Eval2(Left) * Eval2(Right);
}
if (FID >= 0)
{
var Left = Expression.Substring(0, FID);
var Right = Expression.Substring(FID + 1);
return Eval2(Left) / Eval2(Right);
}
// Decimal constant
return decimal.Parse(Expression);
}