Lets going to make a simple WPF application to calculate the Loan Amortization schedule. Here is a XAML code to crate the user interface of the application.
1: <Window x:Class="Amortization.Window1"2: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"3: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"4: Title="Loan Amortization" Height="600" Width="800" Background="Wheat">5: <Grid>6: <Grid.RowDefinitions>7: <RowDefinition/>8: <RowDefinition/>9: <RowDefinition/>10: <RowDefinition Height="4*" />11: <RowDefinition/>12: </Grid.RowDefinitions>13:14: <Grid.ColumnDefinitions>15: <ColumnDefinition/>16: <ColumnDefinition/>17: </Grid.ColumnDefinitions>18:19: <TextBlock Grid.Column="0" Grid.Row="0" Margin="5" VerticalAlignment="Center">20: Principle Amount21: </TextBlock>22:23: <TextBox Grid.Column="1" Grid.Row="0" Margin="5" Name="txtPrinciple" VerticalAlignment="Center">24: </TextBox>25:26: <TextBlock Grid.Column="0" Grid.Row="1" Margin="5" VerticalAlignment="Center">27: Interest Rate28: </TextBlock>29:30: <TextBox Grid.Column="1" Grid.Row="1" Margin="5" Name="txtInterest" VerticalAlignment="Center">31: </TextBox>32:33: <TextBlock Grid.Column="0" Grid.Row="2" Margin="5" VerticalAlignment="Center">34: No of years35: </TextBlock>36:37: <TextBox Grid.Column="1" Grid.Row="2" Margin="5" Name="txtYears" VerticalAlignment="Center">38: </TextBox>39:40: <ListBox Grid.Column="0" Grid.Row="3" Grid.ColumnSpan="2"41: Name="lstAmortization" Background="Wheat" HorizontalContentAlignment="Stretch">42: <ListBox.ItemTemplate>43: <DataTemplate>44: <Border Margin="5" Background="White" BorderBrush="Brown" BorderThickness="5" CornerRadius="10">45: <Grid>46: <Grid.RowDefinitions>47: <RowDefinition/>48: <RowDefinition/>49: <RowDefinition/>50: <RowDefinition/>51: <RowDefinition/>52: </Grid.RowDefinitions>53:54: <Grid.ColumnDefinitions>55: <ColumnDefinition/>56: <ColumnDefinition/>57: </Grid.ColumnDefinitions>58:59: <TextBlock Grid.Row="0" Grid.Column="0" Margin="5">60: Payment No61: </TextBlock>62:63: <TextBlock Grid.Row="0" Grid.Column="1" Margin="5, 0" Foreground="Blue" FontSize="12" Text="{Binding Path=PaymentNo}"/>64:65: <TextBlock Grid.Row="1" Grid.Column="0" Margin="5, 0">66: Payment67: </TextBlock>68:69: <TextBlock Grid.Row="1" Grid.Column="1" Margin="5, 0" Foreground="Blue" FontSize="12" Text="{Binding Path=Payment}"/>70:71: <TextBlock Grid.Row="2" Grid.Column="0" Margin="5, 0">72: Principle73: </TextBlock>74:75: <TextBlock Grid.Row="2" Grid.Column="1" Margin="5, 0" Foreground="Blue" FontSize="12" Text="{Binding Path=Principle}"/>76:77: <TextBlock Grid.Row="3" Grid.Column="0" Margin="5, 0">78: Interest79: </TextBlock>80:81: <TextBlock Grid.Row="3" Grid.Column="1" Margin="5, 0" Foreground="Blue" FontSize="12" Text="{Binding Path=Interest}"/>82:83: <TextBlock Grid.Row="4" Grid.Column="0" Margin="5, 0">84: Balance85: </TextBlock>86:87: <TextBlock Grid.Row="4" Grid.Column="1" Margin="5, 0" Foreground="Blue" FontSize="12" Text="{Binding Path=Balance}"/>88: </Grid>89: </Border>90: </DataTemplate>91: </ListBox.ItemTemplate>92: </ListBox>93:94: <Button Grid.Column="0" Grid.Row="4" Grid.ColumnSpan="2" Width="75" Height="45" Name="btnCalculate" Click="btnCalculate_Click">95: Calculate96: </Button>97: </Grid>98: </Window>99:This application will display the loan amortization schedule in list box. To display it in more user friendly way we use the data template with list box.
Here is a C# code to perform all the calculation.
1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5: using System.Windows;
6: using System.Windows.Controls;
7: using System.Windows.Data;
8: using System.Windows.Documents;
9: using System.Windows.Input;
10: using System.Windows.Media;
11: using System.Windows.Media.Imaging;
12: using System.Windows.Navigation;
13: using System.Windows.Shapes;
14:15: namespace Amortization
16: {17: /// <summary>
18: /// Interaction logic for Window1.xaml
19: /// </summary>
20: public partial class Window1 : Window21: {22: private int years;23: private double interestRate;24: private double principle;25: private int totalPayments;26: private double payment;27: private double monthlyRate;28:29: public Window1()
30: {31: InitializeComponent();32: }33:34: private void btnCalculate_Click(object sender, RoutedEventArgs e)35: {36: years = Convert.ToInt32(txtYears.Text);37: interestRate = Convert.ToDouble(txtInterest.Text) / 100;38: principle = Convert.ToDouble(txtPrinciple.Text);39: monthlyRate = interestRate / 12;40: totalPayments = years * 12;41:42: calculatePayment();43: }44:45: private void calculatePayment()46: {47: // calculate interest term
48: double interestTerm = Math.Pow((1 + monthlyRate), this.totalPayments);49:50: // calculate payment
51: this.payment = (this.principle * monthlyRate) / (1 - (1 / interestTerm));52:53: for (int iIndex = 1; iIndex <= totalPayments; ++iIndex)54: {55: PaymentInfo paymentInfo = new PaymentInfo();
56: paymentInfo.PaymentNo = iIndex;57: paymentInfo.Balance = calculateBalance(iIndex);58: paymentInfo.Payment = payment;59: paymentInfo.Interest = calculateInterestPart(iIndex);60: paymentInfo.Principle = calculatePrinciple(iIndex);61:62: lstAmortization.Items.Add(paymentInfo);63: }64: }65:66: private double calculateBalance(int month)67: {68: double interestTerm = Math.Pow((1 + monthlyRate), month);
69: double totalInterest = this.principle * interestTerm;70: double totalPaid = payment * (interestTerm - 1) / monthlyRate;
71: return totalInterest - totalPaid;
72: }73:74: private double calculateInterestPart(int month)75: {76: double interestTerm = Math.Pow((1 + monthlyRate), (month - 1));
77: double totalInterest = this.principle * interestTerm;78: double totalPaid = payment * (interestTerm - 1) / monthlyRate;
79: return (totalInterest - totalPaid) * monthlyRate;
80: }81:82: private double calculatePrinciple(int month)83: {84: return payment - calculateInterestPart(month);
85: }86:87:88: }89:90: class PaymentInfo
91: {92: private int paymentNo;93: private double payment;94: private double principle;95: private double interest;96: private double balance;97:98: public int PaymentNo99: {100: get { return paymentNo; }101: set { paymentNo = value; }102: }103:104: public double Payment105: {106: get { return payment; }107: set { payment = value; }108: }109:110: public double Principle111: {112: get { return principle; }113: set { principle = value; }114: }115:116: public double Interest117: {118: get { return interest; }119: set { interest = value; }120: }121:122: public double Balance123: {124: get { return balance; }125: set { balance = value; }126: }127: }128:129: }130:Here is the output of this program.
[…] coverage of graph and I wanted to test couple of graph. I already made a loan amortization program here so it would be a perfect choice for me to make a graph for that application. I changed the user […]
By: First experience with Mindscape « Zeeshan Amjad's WPF Blog on August 28, 2012
at 8:38 pm