// | + - | public static string AddOpenBracket(string expression) { int openBracketLeft = CountOpenBrackets(expression); char lastSymbol = GetLastSymbol(expression); if (lastSymbol == ' ') { return(expression + '('); } else if (lastSymbol == '.' || lastSymbol == ',') { return(expression); } else if (!Contains.ToNumbers(lastSymbol) && !Contains.ToAllOperators(lastSymbol)) { return(expression); } else if (lastSymbol == ')' || Contains.ToNumbers(lastSymbol)) { return(expression + '×' + '('); } else if (Contains.ToAllOperators(lastSymbol)) { return(expression + '('); } return(expression); }
// | + - | 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 InvertNumber(string expression) { string result; int operatorIndex = FindNearestOperator(expression); if (operatorIndex == -1 || expression.Length == 0) { result = '-' + expression; } else if (expression[operatorIndex] == '+') { result = ReplaceOperator(expression, operatorIndex, '-'); } else if (expression[operatorIndex] == '(' && expression.Length - 1 > operatorIndex && Contains.ToNumbers(expression[operatorIndex + 1])) { result = expression.Insert(operatorIndex + 1, "-"); } else if (operatorIndex == 0 && expression[operatorIndex] == '(') { result = expression + '-'; } else if (operatorIndex == 0) { result = ReplaceOperator(expression, operatorIndex, ' '); } else if (expression[operatorIndex - 1] == '(' && expression[operatorIndex] == '-') { result = ReplaceOperator(expression, operatorIndex, ' '); } else if (expression[operatorIndex - 1] == ')' && expression[operatorIndex] == '-') { result = ReplaceOperator(expression, operatorIndex, '+'); } else if (Contains.ToAllOperators(expression[operatorIndex - 1]) && expression[operatorIndex] == '-') { result = ReplaceOperator(expression, operatorIndex, ' '); } else if (Contains.ToNumbers(expression[operatorIndex - 1]) && expression[operatorIndex] == '-') { result = ReplaceOperator(expression, operatorIndex, '+'); } else { result = expression.Insert(operatorIndex + 1, "-"); } result = result.Replace(" ", ""); 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 int FindNearestOperator(string expression) { for (int i = expression.Length - 1; i >= 0; i--) { if (Contains.ToNumbers(expression[i])) { continue; } if (Contains.ToSeparators(expression[i])) { continue; } return(i); } return(-1); }
// | + - | public static string AddBracket(string expression) { int openBracketLeft = CountOpenBrackets(expression); char lastSymbol = GetLastSymbol(expression); if (openBracketLeft == 0) { return(AddOpenBracket(expression)); } else if (lastSymbol == ')' || Contains.ToNumbers(lastSymbol)) { return(AddCloseBracket(expression)); } else { return(AddOpenBracket(expression)); } }
// | + - | public static int PriorityOfOperations(string expression) { expression = Parse.RemoveSpace(expression); if (!Parse.IsCorrect(expression)) { throw new NotCorrectException("Выражение не корректно."); } string[] priorityOperators = { "×÷*/", "+-" }; bool openBracket = false; int firstIndex = 1; int lastIndex = expression.Length - 1; for (int i = 0; i < expression.Length; i++) { if (expression[i] == '(') { openBracket = true; firstIndex = i; } else if (expression[i] == ')' && openBracket) { lastIndex = i; break; } } foreach (string operators in priorityOperators) { for (int i = firstIndex; i < lastIndex + 1; i++) { if (operators.Contains(expression[i]) && Contains.ToNumbers(expression[i - 1])) { return(i); } } } return(-1); }
// | + - | 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); }