示例#1
0
文件: Parse.cs 项目: durasel74/Liusse
        // | + - |
        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);
        }
示例#2
0
文件: Parse.cs 项目: durasel74/Liusse
        // | + - |
        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);
        }
示例#3
0
文件: Parse.cs 项目: durasel74/Liusse
        // | + - |
        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);
        }
示例#4
0
文件: Parse.cs 项目: durasel74/Liusse
        // | - - |
        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);
        }
示例#5
0
文件: Parse.cs 项目: durasel74/Liusse
        // | + - |
        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);
        }
示例#6
0
        // | + - |
        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);
        }
示例#7
0
        // | + - |
        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);
        }