// | + - | public static string AddSymbol(string expression, char symbol) { string result = expression; char lastSymbol = GetLastSymbol(expression); if (lastSymbol == ')' && Contains.ToNumbers(symbol)) { result = expression + '×' + symbol; } else if (lastSymbol == ')' && Contains.ToMathOperators(symbol)) { result = expression + symbol; } else if (Contains.ToNumbers(lastSymbol) || Contains.ToNumbers(symbol)) { result = expression + symbol; } else if (Contains.ToMathOperators(lastSymbol) && Contains.ToMathOperators(symbol) && (Contains.ToNumbers(expression[expression.Length - 2]) || expression[expression.Length - 2] == ')')) { result = ReplaceOperator(expression, expression.Length - 1, symbol); } result = result.Replace(" ", ""); return(result); }
// | + - | public static string ReplaceOperator(string expression, int index, char operat) { if (!Contains.ToMathOperators(operat) && operat != ' ') { throw new Exception("Переданный символ не является оператором."); } string temp = expression.Remove(index, 1); string result = temp.Insert(index, "" + operat); return(result); }
// | + - | public static string AddSeparator(string expression) { string symbol = NumberFormatInfo.CurrentInfo.CurrencyDecimalSeparator; char separator = symbol[0]; string result = expression; bool correctLast = false; for (int i = expression.Length - 1; i >= 0; i--) { if (!correctLast) { if (Contains.ToNumbers(expression[expression.Length - 1])) { correctLast = true; } else if (Contains.ToMathOperators( expression[expression.Length - 1]) || expression[expression.Length - 1] == '(') { result += "0" + separator; break; } else { break; } } if (correctLast) { if (Contains.ToSeparators(expression[i])) { break; } if (Contains.ToAllOperators(expression[i])) { result += separator; break; } if (i == 0 && Contains.ToNumbers(expression[i])) { result += separator; } } } if (expression.Length == 0) { result = "0" + separator; } return(result); }
// | - - | public static string RemoveUnnecessaryBrackets(string expression) { string currentExpression = expression; int openBracketIndex = -1; int closeBracketIndex = -1; List <int> deleteIndexes = new List <int>(); bool clear = false; while (!clear) { clear = true; deleteIndexes.Clear(); for (int i = 0; i < currentExpression.Length; i++) { if (currentExpression[i] == '(') { openBracketIndex = i; } else if (currentExpression[i] == ')' && openBracketIndex != -1) { closeBracketIndex = i; } else if (Contains.ToMathOperators(currentExpression[i]) && !(i != 0 && currentExpression[i - 1] == '(' && currentExpression[i] == '-')) { openBracketIndex = -1; closeBracketIndex = -1; } if (openBracketIndex != -1 && closeBracketIndex != -1) { deleteIndexes.Add(openBracketIndex); deleteIndexes.Add(closeBracketIndex); openBracketIndex = -1; closeBracketIndex = -1; clear = false; } } deleteIndexes.Reverse(); foreach (int index in deleteIndexes) { currentExpression = currentExpression.Remove(index, 1); } } return(currentExpression); }
// | + - | public static bool IsCorrect(string expression) { if (expression.Length == 0) { return(false); } bool isCorrect = false; bool isCorrectBracket = true; bool isCorrectSeparators = true; bool isCorrectOperators = true; bool haveABracket = false; for (int i = 0; i < expression.Length; i++) { if (expression[i] == '(' || expression[i] == ')') { haveABracket = true; break; } } if (haveABracket) { isCorrectBracket = IsCorrectBracket(expression); } for (int i = 0; i < expression.Length; i++) { if (Contains.ToSeparators(expression[i]) && i == 0) { isCorrectSeparators = false; } else if (Contains.ToSeparators(expression[i]) && !Contains.ToNumbers(expression[i - 1])) { isCorrectSeparators = false; } if (Contains.ToSeparators(expression[i]) && expression.Length - 1 == i) { isCorrectSeparators = false; } else if (Contains.ToSeparators(expression[i]) && !Contains.ToNumbers(expression[i + 1])) { isCorrectSeparators = false; } if (Contains.ToMathOperators(expression[i]) && expression[i] != '-' && i == 0) { isCorrectOperators = false; } else if (Contains.ToMathOperators(expression[i]) && expression[i] != '-' && !Contains.ToNumbers( expression[i - 1]) && expression[i - 1] != ')') { isCorrectOperators = false; } if (Contains.ToMathOperators(expression[i]) && i == expression.Length - 1) { isCorrectOperators = false; } else if (Contains.ToMathOperators(expression[i]) && expression[i + 1] != '-' && !Contains.ToNumbers( expression[i + 1]) && expression[i + 1] != '(') { isCorrectOperators = false; } if (i != 0 && i != expression.Length - 1 && Contains.ToMathOperators(expression[i - 1]) && Contains.ToMathOperators(expression[i]) && Contains.ToMathOperators(expression[i + 1])) { isCorrectOperators = false; } } if (isCorrectBracket && isCorrectSeparators && isCorrectOperators) { isCorrect = true; } return(isCorrect); }
// | + - | public static string Selector(string expression, int index) { expression = Parse.RemoveSpace(expression); if (!Parse.IsCorrect(expression)) { throw new NotCorrectException("Выражение не корректно."); } if (!Contains.ToMathOperators(expression[index])) { throw new Exception("Переданный индекс не является " + "математическим оператором."); } if (Contains.ToAllOperators(expression[index - 1])) { throw new Exception("Переданный индекс оператора нельзя посчитать."); } int firstIndex = 0; int lastIndex = 0; for (int i = index - 1; i >= 0; i--) { if (i == 0 && !Contains.ToBrackets(expression[i])) { firstIndex = i; break; } else if (expression[i] == '-' && Contains.ToAllOperators( expression[i - 1])) { continue; } else if (Contains.ToAllOperators(expression[i]) && !Contains.ToSeparators(expression[i])) { firstIndex = i + 1; break; } } for (int i = index + 1; i < expression.Length; i++) { if (i == expression.Length - 1) { lastIndex = i; break; } else if (i - index + 1 == 0 && expression[i] == '-') { continue; } else if (Contains.ToAllOperators(expression[i + 1]) && !Contains.ToSeparators(expression[i + 1])) { lastIndex = i; break; } } int subStringSize = lastIndex + 1 - firstIndex; string result = expression.Substring(firstIndex, subStringSize); return(result); }
// | + - | public static object[] Converter(string expression) { if (!Parse.IsCorrect(expression)) { throw new NotCorrectException("Выражение не корректно."); } if (Parse.IsCorrectBracket(expression)) { throw new Exception("Невозможно конвертировать выражение " + "содержащее скобки."); } int countOperators = 0; for (int i = 0; i < expression.Length; i++) { if (Contains.ToMathOperators(expression[i]) && expression[i + 1] != '-' && i != 0) { countOperators++; } } if (countOperators < 1) { throw new Exception("Невозможно конвертировать выражение " + "без операторов."); } else if (countOperators > 1) { throw new Exception("Невозможно конвертировать выражение с " + "более чем одним оператором."); } char operator_ = ' '; string unconvertedLeft = ""; string unconvertedRight = ""; object[] result = new object[3]; char sep = Convert.ToChar(NumberFormatInfo.CurrentInfo.CurrencyDecimalSeparator); for (int i = 0; i < expression.Length; i++) { if (Contains.ToMathOperators(expression[i]) && i != 0) { operator_ = expression[i]; unconvertedLeft = expression.Substring(0, i); unconvertedRight = expression.Substring(i + 1, expression.Length - i - 1); unconvertedLeft = unconvertedLeft.Replace('.', sep). Replace(',', sep); unconvertedRight = unconvertedRight.Replace('.', sep). Replace(',', sep); break; } } result[0] = operator_; result[1] = Convert.ToDecimal(unconvertedLeft); result[2] = Convert.ToDecimal(unconvertedRight); return(result); }