Mercurial > mercurial > hgweb_golang.cgi
comparison src/entai/entai.go @ 0:de451fa0c9cd
golang repository.
| author | pyon@macmini |
|---|---|
| date | Sat, 01 Oct 2016 11:16:31 +0900 |
| parents | |
| children | 451c99c1d9de |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:de451fa0c9cd |
|---|---|
| 1 /****************************************************************************/ | |
| 2 /* Entai.go ( ver 0.1 ) */ | |
| 3 /* Last Change: 2016-09-30 Fri 20:15:52. */ | |
| 4 /****************************************************************************/ | |
| 5 | |
| 6 package entai | |
| 7 | |
| 8 import ( | |
| 9 "fmt" | |
| 10 "time" | |
| 11 ) | |
| 12 | |
| 13 var rate0s, rate1s []float64 | |
| 14 var nyds []time.Time | |
| 15 | |
| 16 type Entai struct { | |
| 17 tax int // 税額 | |
| 18 ed int // 経過日数 | |
| 19 yd0 []int // 各年の 1カ月以内の日数 | |
| 20 yd1 []int // 各年の 1カ月超えの日数 | |
| 21 | |
| 22 due time.Time | |
| 23 paid time.Time | |
| 24 am time.Time | |
| 25 } | |
| 26 | |
| 27 func init() { | |
| 28 // 1カ月まで, 1カ月経過後, 元旦 | |
| 29 createRates( 4.3, 14.6, "20120101" ) // H24 | |
| 30 createRates( 4.3, 14.6, "20130101" ) // H25 | |
| 31 createRates( 4.3, 14.6, "20140101" ) // H26 | |
| 32 createRates( 2.9, 9.2, "20150101" ) // H27 | |
| 33 createRates( 2.8, 9.1, "20160101" ) // H28 | |
| 34 } | |
| 35 | |
| 36 func createRates( r0, r1 float64, y string ) { | |
| 37 t, _ := time.Parse( "20060102", y ) | |
| 38 rate0s = append( rate0s, r0 / 100 ) | |
| 39 rate1s = append( rate1s, r1 / 100 ) | |
| 40 nyds = append( nyds, t ) | |
| 41 } | |
| 42 | |
| 43 func ( e Entai ) String() string { | |
| 44 return "Entai....." | |
| 45 } | |
| 46 | |
| 47 func ( e Entai ) GetRate() string { | |
| 48 var str string | |
| 49 for i, n := range nyds { | |
| 50 str += fmt.Sprintf( " (H%d) ", n.Year() - 1988 ) | |
| 51 str += fmt.Sprintf( "%s :%4.1f / %4.1f\n", n.Format("2006.01.02"), rate0s[i] * 100, rate1s[i] * 100 ) | |
| 52 } | |
| 53 return str | |
| 54 } | |
| 55 | |
| 56 func ( e *Entai ) countDays() { | |
| 57 | |
| 58 for range nyds { | |
| 59 e.yd0 = append( e.yd0, 0 ) | |
| 60 e.yd1 = append( e.yd1, 0 ) | |
| 61 } | |
| 62 | |
| 63 // 1カ月後の算出 | |
| 64 for tmp := e.due; ; { | |
| 65 tmp = tmp.AddDate( 0, 0, 1 ) | |
| 66 for i, nyd := range nyds { | |
| 67 if tmp.Year() == nyd.Year() { | |
| 68 e.yd0[i]++ | |
| 69 } | |
| 70 } | |
| 71 if tmp.Day() == e.due.Day() { | |
| 72 e.am = tmp | |
| 73 break | |
| 74 } | |
| 75 } | |
| 76 | |
| 77 // 過ぎた日数の算出 | |
| 78 for i := 1; ; i++ { | |
| 79 tmp := e.due.AddDate( 0, 0, i ) | |
| 80 for j, nyd := range nyds { | |
| 81 if tmp.Year() == nyd.Year() { | |
| 82 e.yd1[j]++ | |
| 83 } | |
| 84 } | |
| 85 if e.paid.Sub( tmp ) == 0 { | |
| 86 for j, _ := range nyds { | |
| 87 e.yd1[j] -= e.yd0[j] | |
| 88 } | |
| 89 e.yd1[len(e.yd1)-1]-- | |
| 90 e.ed = i - 1 | |
| 91 break | |
| 92 } | |
| 93 } | |
| 94 } | |
| 95 | |
| 96 func ( e *Entai ) Set( d, p time.Time, g int ) { | |
| 97 e.due, e.paid = d, p | |
| 98 e.tax = g | |
| 99 e.countDays() | |
| 100 } | |
| 101 | |
| 102 func ( e *Entai ) Result() ( int, string ) { | |
| 103 | |
| 104 /* 税額の前処理 */ | |
| 105 if e.tax < 2000 { | |
| 106 return 0, "tax < 2000" | |
| 107 } | |
| 108 e.tax = int( e.tax / 1000 * 1000 ) // 端数処理 | |
| 109 | |
| 110 /* 本計算 */ | |
| 111 var tmp float64 | |
| 112 for i, _ := range nyds { | |
| 113 tmp += float64(e.yd0[i]) * rate0s[i] + float64(e.yd1[i]) * rate1s[i] | |
| 114 } | |
| 115 tmp *= float64(e.tax) / 365.0 | |
| 116 | |
| 117 /* 利息の後処理&端数処理 */ | |
| 118 var intrst int | |
| 119 if tmp < 1000 { | |
| 120 intrst = 0 | |
| 121 } else { | |
| 122 intrst = int( tmp / 100 ) * 100 | |
| 123 } | |
| 124 | |
| 125 /* 追加情報 */ | |
| 126 info := fmt.Sprintf( "%.2f,%d =", tmp, e.ed ) | |
| 127 for i, _ := range nyds { | |
| 128 info += fmt.Sprintf( ": %d %d ", e.yd0[i], e.yd1[i] ) | |
| 129 } | |
| 130 | |
| 131 return intrst, info | |
| 132 } | |
| 133 |
