示例#1
0
        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));
        }