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