Overdue Books (dates)

  Download Source Code

/*** Overdue Library Books **************************
Sheila works in the school library.  She needs a quick way
to calcuate a fine for overdue books, based on this table:
   0.25 per day, up to 6 days.
   1.50 for 7-13 days
   3.00 for 14-20 days
   etc, 1.50 per week for each week
The logic is not difficult, but it's much simpler if she
can type in the original due date and the current date,
and the computer tells the appropriate fine.
public class OverdueBooks
  public OverdueBooks()
    String today = input("Today's date (dd.mm)");
    String another = "";
      String dueDate = input("Due date (dd.mm)");
      int days = daysLate(today, dueDate);
      System.out.println("Today = " + today);
      System.out.println("Due = " + dueDate);
      System.out.println("Days overdue = " + days);
      { System.out.println("No fine"); }
      else if(days<=6)
      { System.out.println("Fine = " + (days*0.25)); }
      else if(days<=13)
      { System.out.println("Fine = " + 1.50); }
      else if(days<=20)
      { System.out.println("Fine = " + 3.00); }
      else if(days<=27)
      { System.out.println("Fine = " + 4.50); }
      { System.out.println("Over 4 weeks late - talk to librarian"); }
      another = input("Press [Enter] for another book");
  int daysLate(String today,String dueDate)
    int td = Integer.parseInt(today.substring(0,2));    // today's day
    int tm = Integer.parseInt(today.substring(3,5));    // today's month
    int dd = Integer.parseInt(dueDate.substring(0,2));  // dueDate's day
    int dm = Integer.parseInt(dueDate.substring(3,5));  // dueDate's month
    if(tm == dm)
      if(dd >= td)                     
      {  return -1; }                     // not overdue
      {  return td-dd; }                  // days overdue
    else if (dm > tm)
    {  return -1; }                        // not overdue
    {                                      // tm > dm, due last month
      return (tm-dm)*30 + (td-dd);        // count 30 days per month    
  public static void main(String[] args)
  {  new OverdueBooks();  }
  public String input(String prompt)
  { return javax.swing.JOptionPane.showInputDialog(null,prompt); }

Today = 15.07
Due = 01.07
Days overdue = 14
Fine = 3.0

String Commands

The program inputs two Strings that represent dates, in the format dd.mm, e.g. 25.12 for 25 Dec, or 01.01 for New Year's day.
If the user types a different format, like 12/25 for Dec 25, then the program will not function correctly.  A really good program
would check whether the date is VALID (in the correct format) before processing the data, but that part is left as a practice
exercise for the reader.

The program parses each date String.  Parse means to take apart the String into smaller meaningful pieces.  Each String
starts with 2 digits for the day, followed by a period '.', and finally 2 digits for the month.  The substring method extracts
part of a String, for example:

        String  S = "29.10";
     String  D = S.substring(0,2);   ==>  "29"
     String  M = S.substring(3,5);   ==>  "10"

Converting from String to Integer

After extracting the small Strings containing numbers, the program uses the Processing int( ) function to change these
to actual numbers that can be used in a calculation, to determine the number over due days, or be used in a comparison
       if(D > 31)
     { output("The day part of the date is too large"); }

    if(M < 0 || M > 12)
    {  output("The month value is not valid."); }

Complex Logic

Calculating the overdue charge is not a simple calculation, but rather uses various categories to determine the cost.
The correct category is determined by a complex  if..else if..else if..else command.

This sort of complex logic is known as business rules.  It has nothing to do with natural laws or mathematics,
as these rules are determined by a business and can be changed whenever they wish.  In this program, books that are
over 4 weeks overdue require a human consultation with the librarian to determine the charge (the else part).


The calculation of DaysLate is done in a separate method.  This calculation could have been done inside
the main setup method, but writing a separate method makes the program a bit easier to read.  It also
creates a method that could be re-used in other programs, or called more than once in this program.  Notice that
the method uses return to send an answer back to the main program.

Programming Practice