Home > Mobile >  How to make a loop that validates the user-input dates based on the functions created?
How to make a loop that validates the user-input dates based on the functions created?

Time:04-02

I am not using any datetime module. I created my own functions to calculate the day, month, and year. I want to calculate the refunds based on the date. If the date is invalid, it should ask the user to try again until a date is true.

year = 0
month = 0
day = 0
money_owed = 0

def if_leap_year(year):

    if (year % 400 == 0): return 366
    
    elif (year % 100 == 0): return 365
    
    elif (year % 4 == 0): return 366

    else:
        return 365

#print(if_leap_year(year))

def days_in_month(month, year):
    if month in {1, 3, 5, 7, 8, 10, 12}:
        return 31
    if month == 2:
        if if_leap_year(year):
            return 29
        return 28
    return 30

#print(days_in_month(month, year))

def is_valid_date(year, month, day):
  if days_in_month(month, year)<day:#checks if the given day is possible 
given the month
    return False
  else:
    return True



def days_left_in_year(month, day, year):
    daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31]
    daysLeft = (if_leap_year(year) if month < 3 else 365) - 
sum(daysInMonth[:month - 1]) - day
    return daysLeft

def refund_period():
        month = int(input("Enter the month of the year: "))
        day = int(input("Enter the day of the year: "))
        year = int(input("Enter the year to determine the number of days: "))      
        if is_valid_date(year , month , day):
            money_owed = (days_left_in_year(month, day, year) / 
if_leap_year(year)) * 278
            return round(money_owed, 2)
        else:
            print("Your date is invalid, try again.")


while is_valid_date(year, month, day):
    print('you will be refunded','$',   refund_period())
    break
else:
    print("Your date is invalid, try again.")

I am getting:

you will be refunded $ -8.38

even though the calculation shouldn't be performed since the date is invalid

CodePudding user response:

Your while loop is not comparing the function value but just checking if the object exists. Instead of conditions like while days_left_in_year(month, day, year), use conditions like while days_left_in_year(month, day, year)<30 (assuming you wanted to deny refunds on orders older than 30 days.

To validate dates, add the following function under your comment #print(days_in_month(month, year)):

def is_valid_date(year, month, day)
  if days_in_month(month, year)<day:#checks if the given day is possible given the month
    return False
  else:
    return True

then your condition should look something like this:

if is_valid_date(year, month, day) == True:
    print('you will be refunded','$',   refund_period())
else:
    print("Your date is invalid, try again.")

CodePudding user response:

You are setting year =0 , month =0, day = 0 in first loop. Also the while is not clear. All your functions return an int so never validate if the date is correct. Maybe you can create a function to validate the date something like this :

def is_valid_date(year , month , day):
    ##logic to validate

and you can change this function :

    def refund_period():
        month = int(input("Enter the month of the year: "))
        day = int(input("Enter the day of the year: "))
        year = int(input("Enter the year to determine the number of days: "))      
        if is_valid_date(year , month , day):
            money_owed = (days_left_in_year(month, day, year) / if_leap_year(year)) * 278
            return round(money_owed, 2)
        else :
            print("Your date is invalid, try again.")

Just a couple of comments:

  • You are getting the year, month, and day using input() so you don't need to create global variables for that.
  • you don't need to ask if if_leap_year(year) == 365 or 366 because this function returns 365 or 366 so you can use it directly when you calculate the money_owned, as I do.
  • Related