Пример #1
0
        /// <summary>Calculates a mathematical expression.</summary>
        /// <param name="expression">The expression to calculate.</param>
        /// <param name="options">Optional calculator options to pass. Passing also changes the <see cref="Options"/> property.</param>
        /// <returns>The result of the calculation as a <c>decimal?</c>.
        /// Returns <c>null</c> if the expression is invalid.</returns>
        public decimal?Calculate(string expression, CalculatorOptions options = null)
        {
            if (options != null)
            {
                Options = options;
            }

            if (expression == null || expression.Length == 0)
            {
                return(null);
            }

            if (!Options.Debug)
            {
                // If string can be parsed outright as a decimal
                if (decimal.TryParse(StandardizeDecimal(expression), NumberStyles.Float, CultureInfo.InvariantCulture, out decimal result))
                {
                    return(NormalizeDecimal(result));
                }
            }

            if (Options.Debug)
            {
                DateTimeOffset startTime = DateTimeOffset.Now;
                string         clean     = CleanExpression(expression);
                DateTimeOffset cleanTime = DateTimeOffset.Now;

                List <IToken>  tokenize     = Tokenize(clean);
                DateTimeOffset tokenizeTime = DateTimeOffset.Now;

                IOperation     parse     = Parse(tokenize);
                DateTimeOffset parseTime = DateTimeOffset.Now;

                decimal        resolve     = (parse?.Resolve()).Value;
                DateTimeOffset resolveTime = DateTimeOffset.Now;
                Console.WriteLine($"Clean: {cleanTime.Subtract(startTime).TotalMilliseconds}ms");
                Console.WriteLine($"Tokenize: {tokenizeTime.Subtract(cleanTime).TotalMilliseconds}ms");
                Console.WriteLine($"Parse: {parseTime.Subtract(tokenizeTime).TotalMilliseconds}ms");
                Console.WriteLine($"Resolve: {resolveTime.Subtract(parseTime).TotalMilliseconds}ms");

                return(NormalizeDecimal(resolve));
            }
            else
            {
                return(NormalizeDecimal((Parse(Tokenize(CleanExpression(expression)))?.Resolve()).Value));
            }
        }
Пример #2
0
 public Calculator(List <string> delimiters, CalculatorOptions calculatorOptions, ICalculatorLogger logger) : this(delimiters, calculatorOptions)
 {
     _logger = logger;
 }
Пример #3
0
 /// <summary>
 /// Calculator takes delimiters and options
 /// </summary>
 /// <param name="delimiter"></param>
 public Calculator(List <string> delimiters, CalculatorOptions calculatorOptions)
 {
     _delimiters        = delimiters;
     _calculatorOptions = calculatorOptions;
 }
Пример #4
0
 public Calculator(CalculatorOptions options = null)
 {
     Options = options ?? new CalculatorOptions();
 }