在該類中同樣也覆蓋了基類的 Calculate 虛方法,在主循環中逐月計算還款計劃表。
等本金法的月還本金是固定的,並且在調整貸款利率時也不變,等於貸款金額除以總期數。
但是,在貸款利率不變的情況下,每月還款額卻是遞減的,所以也稱為“遞減法”。
月還利息等於上月剩余貸款余額乘以月利率,月還款額等於月還本金加上月還利息。
然後,本月剩余貸款余額等於上月剩余貸款余額減去月還本金。
最後,由於計算時需要進行捨入處理,到最後一期還款後可能剩余的貸款余額不為零,這就需要在保持月還利息不變的情況下調整月還本金和月還款額。
最後,MainForm.cs 文件中的 MainForm 類如下:
using System;
using System.Data;
using System.Windows.Forms;
namespace Skyiv.Ben.LoanCalculator
{
public sealed partial class MainForm : Form
{
Config cfg;
public MainForm()
{
InitializeComponent();
}
private void MainForm_Load(object sender, EventArgs e)
{
btnCalculte.Enabled = false;
try
{
cfg = new Config("LoanCalculator.XML");
tbxBalance.Text = cfg.Balance.ToString();
tbxMonths.Text = cfg.Months.ToString();
dtpBegin.Value = cfg.Date;
rbnDesc.Checked = !(rbnEq.Checked = cfg.IsEq);
lbxType.DataSource = cfg.Items;
lbxType.SelectedIndex = lbxType.FindStringExact(cfg.Item);
btnCalculate.Enabled = true;
}
catch (Exception ex)
{
tbxOut.Text = Pub.GetMessage(ex);
}
}
private void lbxType_SelectedIndExchanged(object sender, EventArgs e)
{
cfg.SetRates(lbxType.SelectedValue.ToString());
dgvRate.Rows.Clear();
foreach (var kvp in cfg.Rates)
dgvRate.Rows.Add(new object[] { kvp.Key.ToString("yyyy-MM-dd"), kvp.Value.X, kvp.Value.Y });
}
private void btnCalculate_Click(object sender, EventArgs e)
{
btnCalculate.Enabled = false;
try
{
tbxOut.Text = "";
var isEq = rbnEq.Checked;
var date = dtpBegin.Value;
int months;
decimal balance;
if (!int.TryParse(tbxMonths.Text, out months) || months <= 0) throw new Exception("貸款期數必須是正整數");
if (!decimal.TryParse(tbxBalance.Text, out balance) || balance <= 0) throw new Exception("貸款金額必須是正數");
balance *= 10000; // 貸款金額單位是萬元
var loan = isEq ? (new LoanEq(balance, months, date, cfg.Rates) as LoanBase) :
(new LoanDesc(balance, months, date, cfg.Rates) as LoanBase);
dgvOut.Rows.Clear();
foreach (DataRow row in loan.Table.Rows) dgvOut.Rows.Add(row.ItemArray);
}
catch (Exception ex)
{
tbxOut.Text = Pub.GetMessage(ex);
}
btnCalculate.Enabled = true;
}
}
}
當用戶改變貸款種類時,調用該類的 lbxType_SelectedIndExchanged 方法來相應改變貸款利率。
當用戶點擊“計算”按鈕時,就調用該類的 btnCalculate_Click 方法來計算還款計劃表。