001 package com.croftsoft.apps.calc;
002
003 import java.io.*;
004 import java.util.*;
005
006 import com.croftsoft.core.math.FinanceLib;
007
008 /*********************************************************************
009 * Command line financial calculator.
010 *
011 * <p />
012 *
013 * @version
014 * 2001-10-10
015 * @since
016 * 2001-10-10
017 * @author
018 * <a href="http://croftsoft.com/">David Wallace Croft</a>
019 *********************************************************************/
020
021 public final class Calc
022 //////////////////////////////////////////////////////////////////////
023 //////////////////////////////////////////////////////////////////////
024 {
025
026 public static void main ( String [ ] args )
027 throws Exception
028 //////////////////////////////////////////////////////////////////////
029 {
030 System.out.println ( "Calc (c) 2001 CroftSoft Inc" );
031
032 System.out.println ( "http://croftsoft.com/" );
033
034 System.out.println ( "" );
035
036 System.out.println ( "1 = Net Present Value" );
037
038 System.out.println ( "2 = Internal Rate of Return" );
039
040 System.out.println ( "" );
041
042 String line = prompt ( "Function [Quit]: " );
043
044 if ( "1".equals ( line ) )
045 {
046 netPresentValue ( );
047 }
048 else if ( "2".equals ( line ) )
049 {
050 internalRateOfReturn ( );
051 }
052 }
053
054 private static void netPresentValue ( )
055 throws Exception
056 //////////////////////////////////////////////////////////////////////
057 {
058 System.out.println ( "Net Present Value (NPV)" );
059
060 double discountRate
061 = promptDouble ( "DiscountRate (%)", 10.0 ) / 100.0;
062
063 List cashFlowList = new ArrayList ( );
064
065 int time = 0;
066
067 double value;
068
069 double defaultValue = 0.0;
070
071 while ( true )
072 {
073 String line = prompt (
074 "Cash Flow at Time " + time
075 + " (Control-Z or Control-D to end) ["
076 + defaultValue + "]: " );
077
078
079 if ( line == null )
080 {
081 break;
082 }
083
084 if ( "".equals ( line ) )
085 {
086 value = defaultValue;
087 }
088 else
089 {
090 value = Double.parseDouble ( line );
091
092 defaultValue = value;
093 }
094
095 cashFlowList.add ( new Double ( value ) );
096
097 time++;
098 }
099
100 double [ ] cashFlows = new double [ cashFlowList.size ( ) ];
101
102 for ( int i = 0; i < cashFlows.length; i++ )
103 {
104 cashFlows [ i ] = ( ( Double ) cashFlowList.get ( i ) ).doubleValue ( );
105 }
106
107 System.out.println (
108 FinanceLib.netPresentValue ( discountRate, cashFlows ) );
109 }
110
111 private static void internalRateOfReturn ( )
112 throws Exception
113 //////////////////////////////////////////////////////////////////////
114 {
115 System.out.println ( "Internal Rate of Return (IRR)" );
116
117 double irrGuess
118 = promptDouble ( "Estimated IRR (%)", 10.0 ) / 100.0;
119
120 List cashFlowList = new ArrayList ( );
121
122 int time = 0;
123
124 double value;
125
126 double defaultValue = 0.0;
127
128 while ( true )
129 {
130 String line = prompt (
131 "Cash Flow at Time " + time
132 + " (Control-Z or Control-D to end) ["
133 + defaultValue + "]: " );
134
135
136 if ( line == null )
137 {
138 break;
139 }
140
141 if ( "".equals ( line ) )
142 {
143 value = defaultValue;
144 }
145 else
146 {
147 value = Double.parseDouble ( line );
148
149 defaultValue = value;
150 }
151
152 cashFlowList.add ( new Double ( value ) );
153
154 time++;
155 }
156
157 double [ ] cashFlows = new double [ cashFlowList.size ( ) ];
158
159 for ( int i = 0; i < cashFlows.length; i++ )
160 {
161 cashFlows [ i ]
162 = ( ( Double ) cashFlowList.get ( i ) ).doubleValue ( );
163 }
164
165 System.out.println ( ( 100.0 *
166 FinanceLib.internalRateOfReturn ( irrGuess, cashFlows ) ) + "%" );
167 }
168
169 private static String prompt ( String promptString )
170 throws IOException
171 //////////////////////////////////////////////////////////////////////
172 {
173 System.out.print ( promptString );
174
175 return new BufferedReader (
176 new InputStreamReader ( System.in ) ).readLine ( );
177 }
178
179 private static double promptDouble (
180 String promptString,
181 double defaultValue )
182 throws IOException, NumberFormatException
183 //////////////////////////////////////////////////////////////////////
184 {
185 System.out.print ( promptString + " [" + defaultValue + "]: " );
186
187 String line = new BufferedReader (
188 new InputStreamReader ( System.in ) ).readLine ( );
189
190 if ( "".equals ( line ) )
191 {
192 return defaultValue;
193 }
194
195 return Double.parseDouble ( line );
196 }
197
198 //////////////////////////////////////////////////////////////////////
199 //////////////////////////////////////////////////////////////////////
200 }