ExpressionParser icon indicating copy to clipboard operation
ExpressionParser copied to clipboard

bug: Evaluator.cs IsDate(...) & IsNumber(...)

Open josephedwardchang opened this issue 6 years ago • 0 comments

seems to have a bug in code when i was testing... original is:

    static bool IsDate(string lhs, string rhs, out DateTime lhsDate, out DateTime rhsDate)
    {
        lhsDate = default(DateTime);
        rhsDate = default(DateTime);

        if (DateTime.TryParse(lhs, out lhsDate))
        {
            DateTime.TryParse(rhs, out rhsDate);
            return true;
        }
        else if (DateTime.TryParse(rhs, out rhsDate))
        {
            DateTime.TryParse(lhs, out lhsDate);
            return true;
        }
        return false;
    }
    static bool IsNumber(string lhs, string rhs, out decimal lhsNumber, out decimal rhsNumber)
    {
        lhsNumber = 0;
        rhsNumber = 0;

        if (decimal.TryParse(lhs, ExpressionToken.NumberParseStyle, CultureInfo.CurrentCulture, out lhsNumber))
        {
            decimal.TryParse(rhs, ExpressionToken.NumberParseStyle, CultureInfo.CurrentCulture, out rhsNumber);
            return true;
        }
        else if (decimal.TryParse(lhs, ExpressionToken.NumberParseStyle, CultureInfo.CurrentCulture, out lhsNumber))
        {
            decimal.TryParse(rhs, ExpressionToken.NumberParseStyle, CultureInfo.CurrentCulture, out rhsNumber);
            return true;
        }
        return false;
    }

note that IsDate() will fail on runtime and IsNumber() seems to have called lhs side again in else if code... instead of calling rhs side. I provide a simple fix here:

    static bool IsDate(string lhs, string rhs, out DateTime lhsDate, out DateTime rhsDate)
    {
        lhsDate = default(DateTime);
        rhsDate = default(DateTime);

        bool lhsOk = DateTime.TryParse(lhs, out lhsDate);
        bool rhsOk = DateTime.TryParse(rhs, out rhsDate);
        if (lhsOk)
        {
            return rhsOk;
        }
        else if (rhsOk)
        {
            return lhsOk;
        }
        return false;
    }
    static bool IsNumber(string lhs, string rhs, out decimal lhsNumber, out decimal rhsNumber)
    {
        lhsNumber = 0;
        rhsNumber = 0;

        bool lhsOk = decimal.TryParse(lhs, ExpressionToken.NumberParseStyle, CultureInfo.CurrentCulture, out lhsNumber);
        bool rhsOk = decimal.TryParse(rhs, ExpressionToken.NumberParseStyle, CultureInfo.CurrentCulture, out rhsNumber);
        if (lhsOk)
        {
            return rhsOk;
        }
        else if (rhsOk)
        {
            return lhsOk;
        }
        return false;
    }

josephedwardchang avatar May 29 '19 08:05 josephedwardchang