001    /* JAPI - (Yet another (hopefully) useful) Java API
002     *
003     * Copyright (C) 2006 Anja Heim
004     *
005     * This program is free software; you can redistribute it and/or
006     * modify it under the terms of the GNU General Public License as
007     * published by the Free Software Foundation; either version 2 of the
008     * License, or (at your option) any later version.
009     *
010     * This program is distributed in the hope that it will be useful, but
011     * WITHOUT ANY WARRANTY; without even the implied warranty of
012     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
013     * General Public License for more details.
014     *
015     * You should have received a copy of the GNU General Public License
016     * along with this program; if not, write to the Free Software
017     * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
018     * 02111-1307, USA.
019     */
020    
021    package net.sf.japi.finance;
022    
023    /** Class contains some functionality for calculating capital after some periods of time.
024     * @author <a href="mailto:mizzzora@web.de">A. Heim</a>
025     */
026    public class InterestCalculator {
027    
028        private final float initialCapital;
029        private float interestRate;
030        private float currentCapital;
031    
032        public InterestCalculator(final float initialCapital, final float interestRate) {
033            this.initialCapital = initialCapital;
034            this.interestRate   = interestRate;
035            this.currentCapital  = this.initialCapital;
036        }
037    
038        /** Calculates the overall capital after some periods beginnig with given initial capital and interest rate.
039         * <br />The formula is: <code>capital_after_n_periods = start_captial * ( 1 + p/100 )^n</code>
040         * (with p as interest rate)
041         * @param numberOfPeriods
042         * @return the overall capital after numberOfPeriods periods
043         */
044        public float calculateCapital( int numberOfPeriods ) {
045            if ( numberOfPeriods < 0 ) throw new IllegalArgumentException("Number of periods has to be at least 1!");
046            if ( numberOfPeriods == 0 )
047                return initialCapital;
048            if( numberOfPeriods == 1 ) {
049                currentCapital = currentCapital *(1 + interestRate/100);
050            } else {
051                currentCapital = calculateCapital( numberOfPeriods - 1 );
052            }
053            return currentCapital;
054        }
055    
056        /** Returns the current capital.
057         *
058         * @return current capital
059         */
060        public float getCurrentCapital() {
061            return currentCapital;
062        }
063    
064        /** Sets new current capital.
065         *
066         * @param currentCapital
067         */
068        public void setCurrentCapital(float currentCapital) {
069            this.currentCapital = currentCapital;
070        }
071    
072        /** Sets new interest rate.
073         *
074         * @param interestRate
075         */
076        public void setInterestRate(float interestRate) {
077            this.interestRate = interestRate;
078        }
079    
080        /** Returns the current interest rate.
081         *
082         * @return the current interest rate
083         */
084        public float getInterestRate() {
085            return interestRate;
086        }
087    
088        /** Resets the current capital to initial capital.
089         *
090         */
091        public void resetCapital() {
092            this.currentCapital = this.initialCapital;
093        }
094    
095    } // class InterestCalculator