29 Calculating Loan Payments


#29 Calculating Loan Payments

In addition to temperature conversion, another common calculation for your users might well deal with estimating the size of loan payments. This script helps answer the question, "What can I do with that bonus?" ” at least when things are going well.

While the formula to calculate payments based on the principal, interest rate, and duration of the loan is a bit tricky, some judicious use of shell variables tames the beast and makes it surprisingly understandable too.

The Code

 #!/bin/sh #  loancalc - Given a principal loan amount, interest rate, and #    duration of loan (years), calculates the per-payment amount. # Formula is:   M = P * ( J / (1 - (1 + J) ** -N)) #    where P = principal, J = monthly interest rate, N = duration (months) # # Users typically enter P, I (annual interest rate), and L (length, years) . script-library.sh if [ $# -ne 3 ] ; then   echo "Usage: 
 #!/bin/sh # loancalc - Given a principal loan amount, interest rate, and # duration of loan (years), calculates the per-payment amount. # Formula is: M = P * ( J / (1 - (1 + J) ** -N)) # where P = principal, J = monthly interest rate, N = duration (months) # # Users typically enter P, I (annual interest rate), and L (length, years) . script-library.sh if [ $# -ne 3 ] ; then echo "Usage: $0 principal interest loan-duration- years " >&2 exit 1 fi P=$1 I=$2 L=$3 J="$(scriptbc -p 8 $I / \(12 \* 100 \) )" N="$(( $L * 12 ))" M="$(scriptbc -p 8 $P \* \($J / \(1 - \(1 + $J\) \^ -$N\) \) )" # Now a little prettying up of the value: dollars="$(echo $M  cut -d. -f1)" cents="$(echo $M  cut -d. -f2  cut -c1-2)" cat << EOF A $L year loan at $I% interest with a principal amount of $(nicenumber $P 1 ) results in a payment of \$$dollars.$ cents each month for the duration of the loan ($N payments). EOF exit 0 
principal interest loan-duration-years" >&2 exit 1 fi P= I= L= J="$(scriptbc -p 8 $I / \(12 \* 100 \) )" N="$(( $L * 12 ))" M="$(scriptbc -p 8 $P \* \($J / \(1 - \(1 + $J\) \^ -$N\) \) )" # Now a little prettying up of the value: dollars="$(echo $M cut -d. -f1)" cents="$(echo $M cut -d. -f2 cut -c1-2)" cat << EOF A $L year loan at $I% interest with a principal amount of $(nicenumber $P 1 ) results in a payment of $$dollars.$cents each month for the duration of the loan ($N payments). EOF exit 0

Running the Script

This minimalist script expects three parameters to be specified: the amount of the loan, the interest rate, and the duration of the loan (in years).

The Results

I've been eyeing a lovely new Volvo XC90, and I'm curious how much my payments would be if I bought the car. The Volvo is about $40,000 out the door, and the latest interest rates are running at 6.75 percent for an auto loan. I'd like to see how much difference there is in total payments between a four-year and five-year car loan. Easily done:

 $  loancalc 40000 6.75 4  A 4 year loan at 6.75% interest with a principal amount of 40,000 results in a payment of 3.21 each month for the duration of the loan (48 payments). $  loancalc 40000 6.75 5  A 5 year loan at 6.75% interest with a principal amount of 40,000 results in a payment of 7.33 each month for the duration of the loan (60 payments). 

If I can afford the slightly higher payments on the four-year loan, the car will be paid off and the overall amount of the loan (payment * number of payments) will be significantly cheaper. To calculate the exact savings, I can use Script #24, the interactive calculator:

 $  calc '(787.33 * 60) - (953.21 * 48)'  1485.72 

This seems like a worthwhile savings. $1,485.72 would buy a nice little laptop!

Hacking the Script

Exploring the formula itself is beyond the scope of this book, but it's worth noting how even a complex mathematical formula can be implemented directly in a shell script.

The entire calculation could be solved using a single input stream to bc , because that program also supports variables. However, being able to manipulate the intermediate values within the script itself proves beyond the capabilities of the bc command alone. For an example of just such a manipulation, here is the code that splits the resultant monthly payment value and ensures that it's presented as a properly formatted monetary value:

 dollars="$(echo $M  cut -d. -f1)" cents="$(echo $M  cut -d. -f2  cut -c1-2)" 

As it does in so many scripts in this book, the cut command proves tremendously useful here. The second line of this code grabs the portion of the monthly payment value that follows the decimal point and then chops off anything after the second character. Ideally, this modification would round up or down according to the value of the third cents character, rather than doing what is considered a floor function. And this change is surprisingly easy to accomplish: Just add 0.005 cents to the value before truncating the cents amount at two digits.

This script could also really do with a way to prompt for each field if no parameters are specified. And a more sophisticated and useful version of this script would let a user specify any three parameters of the four (principal, interest rate, number of payments, and monthly payment amount) and have the script solve for the fourth value. That way, if you knew you could afford only $500 per month in payments, and that the maximum duration of a 6 percent auto loan was five years, you could ascertain the largest amount of principal that you could borrow .




Wicked Cool Shell Scripts. 101 Scripts for Linux, Mac OS X, and Unix Systems
Wicked Cool Shell Scripts
ISBN: 1593270127
EAN: 2147483647
Year: 2004
Pages: 150
Authors: Dave Taylor

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net