# HG changeset patch # User pyon@macmini # Date 1476306306 -32400 # Node ID 451c99c1d9de75374360ba3fc031a670eb2475cd # Parent 3dafd57af3b12b0cc293c62ee8665c6e4330949e implement intaractive mode. diff -r 3dafd57af3b1 -r 451c99c1d9de src/entai/entai.go --- a/src/entai/entai.go Thu Oct 06 00:55:26 2016 +0900 +++ b/src/entai/entai.go Thu Oct 13 06:05:06 2016 +0900 @@ -1,6 +1,6 @@ /****************************************************************************/ -/* Entai.go ( ver 0.1 ) */ -/* Last Change: 2016-09-30 Fri 20:15:52. */ +/* Entai.go ( ver 0.2 ) */ +/* Last Change: 2016-10-07 Fri 18:32:08. */ /****************************************************************************/ package entai @@ -31,10 +31,11 @@ createRates( 4.3, 14.6, "20140101" ) // H26 createRates( 2.9, 9.2, "20150101" ) // H27 createRates( 2.8, 9.1, "20160101" ) // H28 + createRates( 2.8, 9.1, "20170101" ) // H29 ***** } -func createRates( r0, r1 float64, y string ) { - t, _ := time.Parse( "20060102", y ) +func createRates( r0, r1 float64, nyd string ) { + t, _ := time.Parse( "20060102", nyd ) rate0s = append( rate0s, r0 / 100 ) rate1s = append( rate1s, r1 / 100 ) nyds = append( nyds, t ) @@ -55,9 +56,9 @@ func ( e *Entai ) countDays() { - for range nyds { - e.yd0 = append( e.yd0, 0 ) - e.yd1 = append( e.yd1, 0 ) + for i, _ := range nyds { + e.yd0[i] = 0 + e.yd1[i] = 0 } // 1カ月後の算出 @@ -72,6 +73,11 @@ e.am = tmp break } + if tmp == e.due.AddDate( 0, 1, 0 ) { + tmp = tmp.AddDate( 0, 0, -1 ) + e.am = tmp + break + } } // 過ぎた日数の算出 @@ -93,6 +99,13 @@ } } +func ( e *Entai ) Create() { + for range nyds { + e.yd0 = append( e.yd0, 0 ) + e.yd1 = append( e.yd1, 0 ) + } +} + func ( e *Entai ) Set( d, p time.Time, g int ) { e.due, e.paid = d, p e.tax = g @@ -110,9 +123,9 @@ /* 本計算 */ var tmp float64 for i, _ := range nyds { - tmp += float64(e.yd0[i]) * rate0s[i] + float64(e.yd1[i]) * rate1s[i] + tmp += float64( e.yd0[i] ) * rate0s[i] + float64( e.yd1[i] ) * rate1s[i] } - tmp *= float64(e.tax) / 365.0 + tmp *= float64( e.tax ) / 365.0 /* 利息の後処理&端数処理 */ var intrst int @@ -123,11 +136,13 @@ } /* 追加情報 */ - info := fmt.Sprintf( "%.2f,%d =", tmp, e.ed ) + detail := fmt.Sprintf( "%d,%.0f,%d =", e.tax, tmp, e.ed ) for i, _ := range nyds { - info += fmt.Sprintf( ": %d %d ", e.yd0[i], e.yd1[i] ) + tmp1 := float64( e.yd0[i] ) * rate0s[i] * float64( e.tax ) / 365.0 + tmp2 := float64( e.yd1[i] ) * rate1s[i] * float64( e.tax ) / 365.0 + detail += fmt.Sprintf( ": %d %d (%.0f+%.0f=%.0f)", e.yd0[i], e.yd1[i], tmp1, tmp2, tmp1 + tmp2 ) } - return intrst, info + return intrst, detail } diff -r 3dafd57af3b1 -r 451c99c1d9de src/entai_app/entai_app.go --- a/src/entai_app/entai_app.go Thu Oct 06 00:55:26 2016 +0900 +++ b/src/entai_app/entai_app.go Thu Oct 13 06:05:06 2016 +0900 @@ -1,6 +1,6 @@ /****************************************************************************/ -/* Entai_app.go ( ver 0.2 ) */ -/* Last Change: 2016-10-06 Thu 00:49:10. */ +/* Entai_app.go ( ver 0.3 ) */ +/* Last Change: 2016-10-13 Thu 06:04:09. */ /****************************************************************************/ package main @@ -17,9 +17,12 @@ "entai" ) +var ver = "0.3" +var e entai.Entai + func main() { - var entai entai.Entai + e.Create() // arguments h := flag.Bool( "h", false, "help" ) @@ -35,14 +38,14 @@ flag.Parse() if flag.NFlag() == 0 { - PrintTile() + printTile() flag.PrintDefaults() fmt.Fprint( os.Stderr, "\n" ) os.Exit( 1 ) } if *h { - PrintTile() + printTile() fmt.Fprint( os.Stderr, "1-liner mode:\n" ) fmt.Fprint( os.Stderr, "> entai_app -l 20160731 20161224 30000\n\n" ) fmt.Fprint( os.Stderr, "> entai_app -i -l 20160731 20161224 30000\n\n" ) @@ -53,8 +56,8 @@ } if *r { - PrintTile() - fmt.Fprint( os.Stderr, entai.GetRate() ) + printTile() + fmt.Fprint( os.Stderr, e.GetRate() ) os.Exit( 0 ) } @@ -65,65 +68,88 @@ } if *d { - PrintTile() - //layout := "20060102" - //for { - //} - os.Exit( 0 ) + printTile() + fmt.Print( e.GetRate() ) + fmt.Print( "-----------\n\n" ) + + for { + fmt.Print( "Input Tax > " ) + input := bufio.NewScanner( os.Stdin ) + input.Scan() + t := input.Text() + + fmt.Print( "Input Due > " ) + input = bufio.NewScanner( os.Stdin ) + input.Scan() + d := input.Text() + + fmt.Print( "Input Paid > " ) + input = bufio.NewScanner( os.Stdin ) + input.Scan() + p := input.Text() + + result, _, err := processEntai( d, p, t ) + if err != nil { + fmt.Printf( "%v\n", err ) + } + fmt.Printf( " = %d\n\n", result ) + + } } if *l { - layout := "20060102" - - d, err := time.Parse( layout, flag.Arg(0) ); if err != nil { - fmt.Fprint( os.Stderr, "bad date format.\n" ) - os.Exit( 1 ) - } - p, err := time.Parse( layout, flag.Arg(1) ); if err != nil { - fmt.Fprint( os.Stderr, "bad date format.\n" ) - os.Exit( 1 ) + if *i { + fmt.Printf( "%s,%s,%s,", flag.Arg(0), flag.Arg(1), flag.Arg(2) ) } - t, err := strconv.Atoi( flag.Arg(2) ) - if err != nil || t < 0 { - fmt.Fprint( os.Stderr, "bad money format.\n" ) - os.Exit( 1 ) - } - - if *i { - fmt.Printf( "%v,%v,%d,", d.Format( layout ), p.Format( layout ), t ) - } - - // MAIN - entai.Set( d, p, t ) - result, detail := entai.Result() - // - + result, detail, err := processEntai( flag.Arg(0), flag.Arg(1), flag.Arg(2) ) + if err != nil { + fmt.Fprintf( os.Stderr, "%s : %v\n", detail, err ) + os.Exit( 1 ) + } fmt.Print( result ) if *v { fmt.Print( ",", detail ) } fmt.Print( "\n" ) + os.Exit( 0 ) } if *b { + files := flag.Args() + if len( files ) == 0 { fmt.Fprint( os.Stderr, "no input file.\n" ) os.Exit( 1 ) } else { + for _, file := range files { f, err := os.Open( file ); if err != nil { fmt.Fprintf( os.Stderr, "cannot open file.[%v]\n", err ) os.Exit( 1 ) } + input := bufio.NewScanner( f ) b := bufio.NewWriter( os.Stdout ) for input.Scan() { s := strings.Split( input.Text(), "," ) - fmt.Fprint( b, s[0] ) + if strings.HasPrefix( input.Text(), "#" ) { + if strings.Contains( input.Text(), "@@" ) { + buf := strings.Replace( input.Text(), "#", "", 1 ) + buf = strings.Replace( buf, "@@", "", 1 ) + fmt.Fprintf( b, "%s\n", buf ) + } + continue + } + result, detail, err := processEntai( s[0], s[1], s[2] ) + if err != nil { + fmt.Fprintf( os.Stderr, "%s : %v\n", detail, err ) + os.Exit( 1 ) + } + fmt.Fprintf( b, "%s,%s,%s,%d,%s\n", s[0], s[1], s[2], result, detail ) } b.Flush() f.Close() @@ -133,9 +159,43 @@ } } -func PrintTile() { - fmt.Fprint( os.Stderr, "\n==================================================\n" ) - fmt.Fprint( os.Stderr, " Entai_app ver 0.2 ( 2016.10.09 ) - since 2016\n" ) - fmt.Fprint( os.Stderr, "==================================================\n\n" ) +func processEntai( due, paid, tax string ) ( int, string, error ) { + d, msg, err := validDate( due ); if err != nil { + return -1, msg, err + } + p, msg, err := validDate( paid ); if err != nil { + return -1, msg, err + } + + t, msg, err := validInt( tax ); if err != nil { + return -1, msg, err + } + + e.Set( d, p, t ) + result, detail := e.Result() + + return result, detail, nil } +func validDate( s string ) ( time.Time, string, error ) { + layout := "20060102" + t, err := time.Parse( layout, s ); if err != nil { + return t, "bad date format.", err + } + return t, "", nil +} + +func validInt( s string ) ( int, string, error ) { + i, err := strconv.Atoi( s ) + if err != nil || i < 0 { + return -1, "bad money format.", err + } + return i, "", nil +} + +func printTile() { + fmt.Fprint( os.Stderr, "\n==================================================\n" ) + fmt.Fprintf( os.Stderr, " Entai_app ver %s ( 2016.10.09 ) - since 2016\n", ver ) + fmt.Fprint( os.Stderr, "==================================================\n\n" ) +} +