/// <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)); } }
public Calculator(List <string> delimiters, CalculatorOptions calculatorOptions, ICalculatorLogger logger) : this(delimiters, calculatorOptions) { _logger = logger; }
/// <summary> /// Calculator takes delimiters and options /// </summary> /// <param name="delimiter"></param> public Calculator(List <string> delimiters, CalculatorOptions calculatorOptions) { _delimiters = delimiters; _calculatorOptions = calculatorOptions; }
public Calculator(CalculatorOptions options = null) { Options = options ?? new CalculatorOptions(); }