// | + - | 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 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); }