[WPF] 공공데이터 포털 API 이용 클라이언트 구현 Part 3

이미지
그룹핑 ListViewItem 그룹핑 할 수 있습니다. 먼저 CheckBox에 Checked 이벤트를 통해 그룹핑을 추가하고 RemoveChecked 이벤트를 통해 그룹핑을 제거 할 수 있도록 CheckBox를 선언 합니다. 1: <!-- Group CheckBox --> 2: <CheckBox Grid.Column="0" 3: Grid.Row="0" 4: Checked="AddGrouping" 5: Unchecked="RemoveGrouping">Group by Name</CheckBox> 그룹 스타일 선언 GroupStyle 속성에 ContainerStyle 속성을 이용해 Style을 지정 합니다. Expander 컨트롤을 이용해 아파트명과 그룹 아이템의 개수를 Expander Header에 표시 하도록 ControlTemlate를 선언 합니다. 1: <!-- Group Style --> 2: <ListView.GroupStyle> 3: <GroupStyle> 4: <GroupStyle.ContainerStyle> 5: <Style TargetType="{x:Type GroupItem}"> 6: <Setter Property="Margin" Value="0,0,0,5" /> 7: <Setter Property="Te...

[WPF] 대출 이자 계산 툴

대출 이자 계산 툴

대출을 받을 일이 생겼습니다..ㅠㅠ 
이자 계산, 상환 방법이 여러가지가 있어 공부할 겸 툴로 구현해 보겠습니다.

개발 환경

  • C#
  • WPF

상환 방법 종류로는:
  • 원금 균등 상환
  • 원리금 균등 상환
이 있습니다.

이자 계산 툴의 가장 중요한 부분인 두 상환 방법을 구현한 코드부터 작성 하겠습니다.

1:  /// <summary>  
2:      /// 원금 균등 상환방식   
3:      /// </summary>  
4:      /// <param name="loanMoney"></param>  
5:      /// <param name="loanTerm"></param>  
6:      /// <param name="interestRate"></param>  
7:      /// <returns></returns>  
8:      private List<RepaymentItem> PrincipalRepayment(double loanMoney, int loanTerm, double interestRate)  
9:      {  
10:        List<RepaymentItem> repayments = new List<RepaymentItem>();  
11:    
12:        double left = loanMoney;  
13:        // 원금  
14:        double payment = Math.Round(loanMoney / loanTerm);  
15:        // 대출 이자율(연이자율/12), 소수점 6자리  
16:        double yearInterest = Math.Round(interestRate / YearOfMonthCount, 6) / 100;  
17:        //double yearInterest = Math.Round(interestRate / 100 / YearOfMonthCount, 6);  
18:    
19:        for (int i = 1; i <= loanTerm; i++)  
20:        {  
21:          // 이자  
22:          double interest = Math.Round(left * yearInterest, 6);  
23:          // 남은 금액  
24:          left = (left - payment < 0) ? 0 : (left - payment);  
25:    
26:          Trace.WriteLine(string.Format("회차: {0}, 원금:{1:c}, 이자:{2:c}, 남은 금액: {3:c}", i, payment, interest, left));  
27:    
28:          repayments.Add(new RepaymentItem  
29:          {  
30:            Count = i,  
31:            Payment = payment,  
32:            Interest = interest,  
33:            PaymentTotal = payment + interest,  
34:            Balance = left  
35:          });  
36:        }  
37:    
38:        return (repayments.Count == 0) ? null : repayments;  
39:      }  
40:        
41:      /// <summary>  
42:      /// 원리금 균등 상환방식  
43:      /// </summary>  
44:      /// <param name="loanMoney"></param>  
45:      /// <param name="loanTerm"></param>  
46:      /// <param name="interestRate"></param>  
47:      /// <returns></returns>  
48:      private List<RepaymentItem> PrincipleRepayment(double loanMoney, int loanTerm, double interestRate)  
49:      {  
50:        List<RepaymentItem> repayments = new List<RepaymentItem>();  
51:    
52:        // 남은금액  
53:        double left = loanMoney;  
54:        // 대출 이자율(연이자율/12), 소수점 6자리  
55:        double yearInterest = Math.Round(interestRate / YearOfMonthCount, 6) / 100;  
56:    
57:        // 원금 * 대출이자율(1 + 대출이자율) 제곱 month  
58:        // ---------------------------------------  
59:        // (1 + 대출이자율) 제곱 month - 1  
60:    
61:        // 분모  
62:        double denominator = Math.Pow(yearInterest + 1, loanTerm) - 1;  
63:        // 분자  
64:        double molecule = loanMoney * yearInterest * (Math.Pow(yearInterest + 1, loanTerm));  
65:        // 월상환금  
66:        double monthPayment = Math.Round(molecule / denominator);  
67:    
68:        for (int i = 1; i <= loanTerm; i++)  
69:        {  
70:          // 이자  
71:          double interest = Math.Round(left * yearInterest);  
72:          // 상환할 원금  
73:          double payment = monthPayment - interest;  
74:          // 남은 금액  
75:          left = (left - payment < 0) ? 0 : left - payment ;  
76:    
77:          Trace.WriteLine(string.Format("회차: {0}, 원금:{1:c}, 이자:{2:c}, 남은 금액: {3:c}", i, payment, interest, left));  
78:    
79:          repayments.Add(new RepaymentItem  
80:          {  
81:            Count = i,  
82:            Payment = payment,  
83:            Interest = interest,  
84:            PaymentTotal = monthPayment,  
85:            Balance = left  
86:          });  
87:        }  
88:    
89:        return (repayments.Count == 0) ? null : repayments;  
90:      }  

두 메서드는 매개변수로 대출금, 대출기간, 이자율을 받아 회차 별로 계산을 합니다.

이자 계산 툴이다 보니 두 메서드를 사용하면 사실 거의 끝났다고 봐도 될 것 같습니다.
이제 UI를 구성해야 겠지요! 아래 그림을 참고해 주세요.


레이아웃을 그리드를 이용해 1Column, 3Row 로 구성:
  • 첫번째 row는 검색 조건
  • 두번째 row는 결과 
  • 세번째 row는 이벤트를 발생하는 버튼
합니다.

UI 결과란에 검색 조건을 이용한 계산을 실행 할 이벤트를 구현 해보겠습니다.

1:  /// <summary>  
2:      /// 계산 버튼 이벤트  
3:      /// </summary>  
4:      /// <param name="sender"></param>  
5:      /// <param name="e"></param>  
6:      private void btnCalc_Click(object sender, RoutedEventArgs e)  
7:      {  
8:        // 대출금  
9:        double loanMoney = 0;  
10:        // 대출 기간 종류  
11:        short loanType = 0;  
12:        // 대출 기간  
13:        int loanTerm = 0;  
14:        // 연이자율  
15:        double interestOfYear = 0;  
16:        // 상환종류  
17:        short interestType = 0;  
18:    
19:        if (!double.TryParse(  
20:          txtLoanMoney.Text,   
21:          System.Globalization.NumberStyles.Currency,   
22:          System.Threading.Thread.CurrentThread.CurrentUICulture,   
23:          out loanMoney))  
24:        {  
25:          // 잘못된 입력  
26:          return;  
27:        }  
28:          
29:        if (!int.TryParse(txtTerm.Text, out loanTerm))  
30:        {  
31:          return;  
32:        }  
33:    
34:        if (!double.TryParse(txtInterestOfYear.Text, out interestOfYear))  
35:        {  
36:          return;  
37:        }  
38:    
39:        loanType = (rbYear.IsChecked.Value) ? (short)0 : (short)1;  
40:        interestType = (rbPrincipal.IsChecked.Value) ? (short)0 : (short)1;  
41:    
42:        // 대출 기간 종류가 년일 경우 월로 계산  
43:        loanTerm = (loanType == 0) ? loanTerm * 12 : loanTerm;  
44:    
45:        List<RepaymentItem> repayments = null;  
46:        if (interestType == 0)  
47:        {  
48:          // 원금 균등 상환방식  
49:          repayments = PrincipalRepayment(loanMoney, loanTerm, interestOfYear);  
50:        }  
51:        else  
52:        {  
53:          // 원리금 균등 상환방식  
54:          repayments = PrincipleRepayment(loanMoney, loanTerm, interestOfYear);  
55:        }  
56:    
57:        if (repayments != null)  
58:        {  
59:          double interestSum = repayments.Sum(r => r.Interest);  
60:    
61:          tbAmount.Text = loanMoney.ToString("N0");  
62:          tbTotalInterest.Text = interestSum.ToString("N0");  
63:          tbTotalPayment.Text = (loanMoney + interestSum).ToString("N0");  
64:    
65:          gridResult.Visibility = Visibility.Visible;  
66:        }  
67:      }  

계산 버튼에 이벤트를 등록 합니다.
1:  <Button x:Name="btnCalc" Grid.Column="0" Content="계산하기" Margin="150,15,15,15" Click="btnCalc_Click" />  

이번에 구현한 이자 계산 툴은 UI 결과로 총 이자 계산 결과를 보여주고 있지만, 상환 방법 별 메서드에서 '상환 정보 객체'를 리스트로 반환을 하기에 리스트를 이용해 회차 별 상환 정보를 볼 수 있도록 추가 구현도 가능 합니다.
1:  /// <summary>  
2:    /// 상환 정보 객체  
3:    /// </summary>  
4:    public class RepaymentItem  
5:    {  
6:      // 회차  
7:      public int Count { get; set; }  
8:      // 납입원금  
9:      public double Payment { get; set; }  
10:      // 대출이자  
11:      public double Interest { get; set; }  
12:      // 월상환금  
13:      public double PaymentTotal { get; set; }  
14:      // 대출잔금  
15:      public double Balance { get; set; }  
16:    }  


댓글

이 블로그의 인기 게시물

[C#] Task 완료 시 다른 Task를 자동으로 수행

[C#] 태스크(Task)가 완료될 때 까지 대기하여 결과를 얻는 방법

[C#] 명시적으로 Task 생성 및 실행