changeset 2:451c99c1d9de

implement intaractive mode.
author pyon@macmini
date Thu, 13 Oct 2016 06:05:06 +0900
parents 3dafd57af3b1
children ca866a38a6a0
files src/entai/entai.go src/entai_app/entai_app.go
diffstat 2 files changed, 128 insertions(+), 53 deletions(-) [+]
line wrap: on
line diff
--- 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
 }
 
--- 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" )
+}
+