Пример #1
0
        public static bool DoMaths(ref string number, ref double l1, ref double l2, ref Operation op, Operation newOp, ref bool firstOperation)
        {
            // Do not assign l2 if it's first time
            if (!firstOperation)
            {
                if (!double.TryParse(number, out l2))
                {
                    number = MUtil.ExpNotationToDecimalNotation(number);
                    if (!double.TryParse(number, out l1))
                    {
                        Debug.LogError("Cannot parse " + number + " to number ( double )");
                        return(false);
                    }
                }



                l1 = op.function.Invoke(l1, l2);
            }
            else
            {
                firstOperation = false;
            }
            number = "";
            op     = newOp;

            return(true);
        }
Пример #2
0
        public static double Calculate(string data)
        {
            if (data.Length == 0)
            {
                Debug.LogError("Data is empty");
                return(double.NaN);
            }

            if (operations == null)
            {
                FillOperationsList();
            }

            if (bracketsFunctions == null)
            {
                FillBracketsFunctions();
            }

            data = MUtil.RemoveSpaces(data);

            data = ChangePunctuationMark(data);
            data = MUtil.ExpNotationToDecimalNotation(data);

            data = ReplaceConstants(data);

            data = CalculateBrackets(data);
            if (data.StartsWith("E"))
            {
                return(double.NaN);
            }


            data = CalculateExpression(data);


            double result = 0;

            if (!double.TryParse(data, out result))
            {
                Debug.LogError("Cannot parse " + data + " to result ( double )");
                return(double.NaN);
            }

            return(result);
        }
Пример #3
0
        public static string CalculateSpecificOperations(string data, Operation[] allowedOperations)
        {
            double    l1 = 0, l2 = 0;
            Operation op = null; // First operation is always addition


            string actualNumber    = "";
            bool   noPrevOperators = true;

            bool operationIsAllowed = false;

            int    startIndex = 0;
            string startData  = "";

            for (int i = 0; i < data.Length; i++)
            {
                op = FindOperation(data[i]);

                if (op != null)
                {
                    if (i == 0 && data[0] == '-')
                    {
                        startData += data[0];
                        continue;
                    }
                    startIndex = i;
                    break;
                }

                startData += data[i];
            }

            // No operator
            if (op == null)
            {
                return(data);
            }

            if (startIndex == 0)
            {
                Debug.LogError("Operator without number: \"" + data + "\" op: " + op.name);
                return("EOPWTHTNMBR");
            }



            if (!double.TryParse(startData, out l1))
            {
                if (startData[startData.Length - 1] == 'E')
                {
                    for (int i = startData.Length; i < data.Length; i++)
                    {
                        if (MUtil.IsNumber(data[i]) || data[i] == '+')
                        {
                            startData += data[i];
                        }
                        else
                        {
                            break;
                        }
                    }

                    for (int i = 0; i < data.Length; i++)
                    {
                        if (data[i] == 'E')
                        {
                            if (data.Length > i + 1)
                            {
                                if (data[i + 1] == '+')
                                {
                                    i += 2;
                                }
                            }
                        }

                        op = FindOperation(data[i]);
                        if (op != null)
                        {
                            break;
                        }
                    }

                    l1   = MUtil.GetDoubleFromExpNotation(startData);
                    data = data.Remove(0, startData.Length);

                    string decimalStartData = MUtil.ExpNotationToDecimalNotation(startData);
                    data      = data.Insert(0, decimalStartData);
                    startData = decimalStartData;

                    startIndex = startData.Length;

                    Debug.Log("Data after converting exponent notation: " + data);
                }
                else
                {
                    Debug.LogError("Cannot convert " + startData + " to l1 ( double )");
                    return("ECONVERSION");
                }

                if (l1.Equals(double.NaN))
                {
                    Debug.LogError("Cannot convert " + startData + " to l1 ( double ). l1 = NaN");
                    return("ECONVERSION");
                }
            }

            actualNumber = startData;
            bool firstOperation = true;

            // Multiply
            for (int i = startIndex; i < data.Length; i++)
            {
                Operation aop = FindOperation(data[i]);
                if (aop != null)
                {
                    if (actualNumber.Length == 0 && data[i] == '-')
                    {
                        actualNumber += data[i];
                        continue;
                    }

                    operationIsAllowed = false;
                    for (int j = 0; j < allowedOperations.Length; j++)
                    {
                        if (op == allowedOperations[j])
                        {
                            operationIsAllowed = true;
                            break;
                        }
                    }
                    if (operationIsAllowed)
                    {
                        if (data[i] == '+' && i > 0 && (data[i - 1] == 'E'))
                        {
                            actualNumber += data[i];
                            continue;
                        }

                        //Debug.Log("Data before: " + data);
                        if (noPrevOperators)
                        {
                            data = data.Remove(0, actualNumber.Length);
                            i    = 0;
                        }
                        else
                        {
                            string l1Str = MUtil.ToStandardNotationString(l1);

                            data = data.Remove(i - actualNumber.Length - 1 - l1Str.Length, actualNumber.Length + 1 + l1Str.Length);
                            i   -= actualNumber.Length + 1 + l1Str.Length;
                        }

                        noPrevOperators = false;

                        //l1 = l2;

                        //actualNumber = MUtil.ExpNotationToDecimalNotation(actualNumber);

                        if (!DoMaths(ref actualNumber, ref l1, ref l2, ref op, aop, ref firstOperation))
                        {
                            return("ECONVERSION");
                        }


                        string standardNotL1 = MUtil.ToStandardNotationString(l1);

                        data         = data.Insert(i, standardNotL1);
                        i           += standardNotL1.Length;
                        actualNumber = "";
                        op           = aop;
                        //Debug.Log("Data after: " + data);
                    }
                    else
                    {
                        if (data[i] == '+' && i > 0 && (data[i - 1] == 'E'))
                        {
                            actualNumber += data[i];
                            continue;
                        }
                        if (!double.TryParse(actualNumber, out l1))
                        {
                            actualNumber = MUtil.ExpNotationToDecimalNotation(actualNumber);
                            if (!double.TryParse(actualNumber, out l1))
                            {
                                Debug.LogError("Cannot parse " + actualNumber + " to number ( double ) #2");
                                return("ECONVERSION");
                            }
                        }

                        op              = aop;
                        actualNumber    = "";
                        noPrevOperators = false;

                        firstOperation = false;
                    }
                }
                else
                {
                    actualNumber += data[i];
                }
            }

            operationIsAllowed = false;
            for (int j = 0; j < allowedOperations.Length; j++)
            {
                if (op == allowedOperations[j])
                {
                    operationIsAllowed = true;
                    break;
                }
            }
            if (operationIsAllowed)
            {
                if (data[data.Length - 1] == '+' && data.Length > 0 && (data[data.Length - 1] == 'E'))
                {
                    return(data);
                }

                //Debug.Log("l1.ToString(): " + MUtil.ExpNotationToDecimalNotation(l1.ToString()) + ", lenght: " + MUtil.ExpNotationToDecimalNotation(l1.ToString()).Length);
                string l1Str = MUtil.ToStandardNotationString(l1);
                data = data.Remove(data.Length - actualNumber.Length - 1 - l1Str.Length, actualNumber.Length + 1 + l1Str.Length);

                noPrevOperators = false;

                //l1 = l2;
                //actualNumber = MUtil.ExpNotationToDecimalNotation(actualNumber);

                if (!DoMaths(ref actualNumber, ref l1, ref l2, ref op, operations[0], ref firstOperation))
                {
                    return("ECONVERSION");
                }



                data = data.Insert(data.Length, MUtil.ToStandardNotationString(l1));
                //i += l1.ToString().Length;
                actualNumber = "";
                op           = operations[0];
                //Debug.Log("Data after: " + data);
            }


            return(data);
        }