Exemple #1
0
        public void GrowNodeTreeTest4()
        {
            string test = "((386))";

            ICalculationOperation node_386 = new Number(386M);

            ICalculationOperation actualNode = CalculationParser.GrowNodeTree(input: test, culture: new CultureInfo("es-ES"));

            Assert.AreEqual(actualNode, node_386);
        }
Exemple #2
0
        public void GrowNodeTreeTest3()
        {
            string test = "((2) + 3,0000)";

            ICalculationOperation node_2        = new Number(2M);
            ICalculationOperation node_3        = new Number(3.0000M);
            ICalculationOperation node_2_plus_3 = new Addition(node_2, node_3);

            ICalculationOperation actualNode = CalculationParser.GrowNodeTree(input: test, culture: new CultureInfo("es-ES"));

            Assert.AreEqual(actualNode, node_2_plus_3);
        }
Exemple #3
0
        public void GrowNodeTreeTest1()
        {
            string test = "2 + 3";

            ICalculationOperation node_2        = new Number(2M);
            ICalculationOperation node_3        = new Number(3M);
            ICalculationOperation node_2_plus_3 = new Addition(node_2, node_3);

            ICalculationOperation actualNode = CalculationParser.GrowNodeTree(input: test, culture: new CultureInfo("zh-HK"));

            Assert.AreEqual(actualNode, node_2_plus_3);
        }
Exemple #4
0
        public void GrowNodeTreeTest2()
        {
            string test = "6-8/((  4.2))";

            ICalculationOperation node_6                          = new Number(6M);
            ICalculationOperation node_8                          = new Number(8M);
            ICalculationOperation node_4_point_2                  = new Number(4.2M);
            ICalculationOperation node_8_divide_4_point_2         = new Division(node_8, node_4_point_2);
            ICalculationOperation node_6_minus_8_divide_4_point_2 = new Subtraction(node_6, node_8_divide_4_point_2);

            ICalculationOperation actualNode = CalculationParser.GrowNodeTree(input: test, culture: new CultureInfo("ja-JP"));

            Assert.AreEqual(actualNode, node_6_minus_8_divide_4_point_2);
        }
        internal static string ExecuteExpression(string input, CultureInfo culture)
        {
            string decimalResult = null;

            try
            {
                var myNode = CalculationParser.GrowNodeTree(input: input, culture: culture);

                if (myNode != null)
                {
                    decimal result = DisplayDecimalResult(node: myNode, culture: culture);
                    decimalResult = result.ToString($"n{PrecisionForDecimalResult}", culture);
                    decimalResult = decimalResult.TrimEnd('0').TrimEnd(Separator(culture: culture));

                    string binaryResult = Convertions.ConvertDecimalToBinaryString
                                              (input: result, precisionForBinary: PrecisionForBinaryResult, culture: culture);

                    DisplayBinaryResult(input: result, culture: culture);

                    Console.ForegroundColor = ConsoleColor.White;

                    Notify?.Invoke();
                    Notify = null;
                }
            }
            catch (CheckingException exception)
            {
                Console.ForegroundColor = ConsoleColor.Magenta;
                Console.WriteLine("Error: " + exception.Message);
            }
            catch (DivideByZeroException)
            {
                Console.ForegroundColor = ConsoleColor.Magenta;
                Console.WriteLine("Error: Divide by Zero");
            }
            catch (OverflowException)
            {
                Console.ForegroundColor = ConsoleColor.Magenta;
                Console.WriteLine("Error: Too large or too small value");
            }
            catch (Exception)
            {
                Console.ForegroundColor = ConsoleColor.Magenta;
                Console.WriteLine("Error: Calculation failed");
            }

            return(decimalResult);
        }
Exemple #6
0
 public void SetupParser()
 {
     _parser = new CalculationParser();
 }
        internal CalcResult ExecuteExpression()
        {
            var decimalResult     = String.Empty;
            var binaryResult      = String.Empty;
            var hexadecimalResult = String.Empty;
            var decimalSeparator  = $"{Separator(culture: Culture)}";
            var message           = $"note, your decimal separator is a ' " + decimalSeparator + " '";

            if (String.IsNullOrWhiteSpace(Expression))
            {
                return(new CalcResult(decResult: decimalResult, binResult: binaryResult,
                                      hexResult: hexadecimalResult, message: message, separator: decimalSeparator));
            }

            try
            {
                var myNode = CalculationParser.GrowNodeTree(input: Expression, culture: Culture);

                if (myNode != null)
                {
                    decimal result = myNode.Calculate();

                    decimalResult = result.ToString($"n{PrecisionForDecimalResult}", Culture).
                                    TrimEnd('0').TrimEnd(Separator(culture: Culture));

                    binaryResult = Convertions.ConvertDecimalToBinaryString
                                       (input: Decimal.Parse(decimalResult, Culture), precisionForBinary: PrecisionForBinaryResult,
                                       culture: Culture);

                    hexadecimalResult = Convertions.ConvertDecimalToHexadecimalString
                                            (input: Decimal.Parse(decimalResult, Culture));

                    int signsAfterSeparator = SignsAfterSeparator(number: result, separator: decimalSeparator);

                    message = CheckOnFractionalRounding(afterRounding: decimalResult, precision: PrecisionForDecimalResult,
                                                        message: message, beforeRounding: result.ToString($"n{signsAfterSeparator}", Culture).
                                                        TrimEnd('0').TrimEnd(Separator(culture: Culture)));
                }
            }
            catch (CheckingException exception)
            {
                message = exception.Message;
            }
            catch (DivideByZeroException)
            {
                message           = "Divide by Zero gives you infinity";
                decimalResult     = Infinity;
                binaryResult      = Infinity;
                hexadecimalResult = Infinity;
            }
            catch (OverflowException)
            {
                message = "value is too large or too small";
            }
            catch (Exception)
            {
                message = "Calculation failed";
            }

            return(new CalcResult(decResult: decimalResult, binResult: binaryResult,
                                  hexResult: hexadecimalResult, message: message, separator: decimalSeparator));
        }