support importing transaction by csv/tsv file via command line
This commit is contained in:
+68
-1
@@ -1,6 +1,11 @@
|
||||
package utils
|
||||
|
||||
import "strconv"
|
||||
import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/mayswind/ezbookkeeping/pkg/errs"
|
||||
)
|
||||
|
||||
// IntToString returns the textual representation of this number
|
||||
func IntToString(num int) string {
|
||||
@@ -123,3 +128,65 @@ func FormatAmount(amount int64) string {
|
||||
|
||||
return integer + "." + decimals
|
||||
}
|
||||
|
||||
// ParseAmount parses a textual representation of amount
|
||||
func ParseAmount(amount string) (int64, error) {
|
||||
if len(amount) < 1 {
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
sign := int64(1)
|
||||
|
||||
if amount[0] == '-' {
|
||||
amount = amount[1:]
|
||||
sign = -1
|
||||
}
|
||||
|
||||
if len(amount) < 1 {
|
||||
return 0, errs.ErrNumberInvalid
|
||||
}
|
||||
|
||||
items := strings.Split(amount, ".")
|
||||
|
||||
if len(items) > 2 {
|
||||
return 0, errs.ErrNumberInvalid
|
||||
}
|
||||
|
||||
var err error
|
||||
integer := int64(0)
|
||||
decimals := int64(0)
|
||||
|
||||
if len(items[0]) > 0 {
|
||||
integer, err = StringToInt64(items[0])
|
||||
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
if integer < 0 {
|
||||
return 0, errs.ErrNumberInvalid
|
||||
}
|
||||
}
|
||||
|
||||
if len(items) == 2 {
|
||||
if len(items[1]) > 2 {
|
||||
return 0, errs.ErrNumberInvalid
|
||||
}
|
||||
|
||||
decimals, err = StringToInt64(items[1])
|
||||
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
if decimals < 0 {
|
||||
return 0, errs.ErrNumberInvalid
|
||||
}
|
||||
|
||||
if len(items[1]) == 1 {
|
||||
decimals = decimals * 10
|
||||
}
|
||||
}
|
||||
|
||||
return sign*integer*100 + sign*decimals, nil
|
||||
}
|
||||
|
||||
@@ -172,3 +172,133 @@ func TestFormatAmount(t *testing.T) {
|
||||
actualValue = FormatAmount(-1234)
|
||||
assert.Equal(t, expectedValue, actualValue)
|
||||
}
|
||||
|
||||
func TestParseAmount(t *testing.T) {
|
||||
expectedValue := int64(0)
|
||||
actualValue, err := ParseAmount("")
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, expectedValue, actualValue)
|
||||
|
||||
expectedValue = int64(0)
|
||||
actualValue, err = ParseAmount("0")
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, expectedValue, actualValue)
|
||||
|
||||
expectedValue = int64(0)
|
||||
actualValue, err = ParseAmount("-0")
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, expectedValue, actualValue)
|
||||
|
||||
expectedValue = int64(0)
|
||||
actualValue, err = ParseAmount("0.00")
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, expectedValue, actualValue)
|
||||
|
||||
expectedValue = int64(0)
|
||||
actualValue, err = ParseAmount("-0.00")
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, expectedValue, actualValue)
|
||||
|
||||
expectedValue = int64(1)
|
||||
actualValue, err = ParseAmount("0.01")
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, expectedValue, actualValue)
|
||||
|
||||
expectedValue = int64(-1)
|
||||
actualValue, err = ParseAmount("-0.01")
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, expectedValue, actualValue)
|
||||
|
||||
expectedValue = int64(10)
|
||||
actualValue, err = ParseAmount("0.10")
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, expectedValue, actualValue)
|
||||
|
||||
expectedValue = int64(-10)
|
||||
actualValue, err = ParseAmount("-0.10")
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, expectedValue, actualValue)
|
||||
|
||||
expectedValue = int64(10)
|
||||
actualValue, err = ParseAmount("0.1")
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, expectedValue, actualValue)
|
||||
|
||||
expectedValue = int64(-10)
|
||||
actualValue, err = ParseAmount("-0.1")
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, expectedValue, actualValue)
|
||||
|
||||
expectedValue = int64(12)
|
||||
actualValue, err = ParseAmount("0.12")
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, expectedValue, actualValue)
|
||||
|
||||
expectedValue = int64(-12)
|
||||
actualValue, err = ParseAmount("-0.12")
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, expectedValue, actualValue)
|
||||
|
||||
expectedValue = int64(100)
|
||||
actualValue, err = ParseAmount("1")
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, expectedValue, actualValue)
|
||||
|
||||
expectedValue = int64(-100)
|
||||
actualValue, err = ParseAmount("-1")
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, expectedValue, actualValue)
|
||||
|
||||
expectedValue = int64(120)
|
||||
actualValue, err = ParseAmount("1.2")
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, expectedValue, actualValue)
|
||||
|
||||
expectedValue = int64(-120)
|
||||
actualValue, err = ParseAmount("-1.2")
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, expectedValue, actualValue)
|
||||
|
||||
expectedValue = int64(123)
|
||||
actualValue, err = ParseAmount("1.23")
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, expectedValue, actualValue)
|
||||
|
||||
expectedValue = int64(-123)
|
||||
actualValue, err = ParseAmount("-1.23")
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, expectedValue, actualValue)
|
||||
|
||||
expectedValue = int64(1234)
|
||||
actualValue, err = ParseAmount("12.34")
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, expectedValue, actualValue)
|
||||
|
||||
expectedValue = int64(-1234)
|
||||
actualValue, err = ParseAmount("-12.34")
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, expectedValue, actualValue)
|
||||
}
|
||||
|
||||
func TestParseAmount_InvalidAmount(t *testing.T) {
|
||||
_, err := ParseAmount("-")
|
||||
assert.NotNil(t, err)
|
||||
|
||||
_, err = ParseAmount("--1")
|
||||
assert.NotNil(t, err)
|
||||
|
||||
_, err = ParseAmount("-.-1")
|
||||
assert.NotNil(t, err)
|
||||
|
||||
_, err = ParseAmount("0.-")
|
||||
assert.NotNil(t, err)
|
||||
|
||||
_, err = ParseAmount("0.-1")
|
||||
assert.NotNil(t, err)
|
||||
|
||||
_, err = ParseAmount("1.2.3")
|
||||
assert.NotNil(t, err)
|
||||
|
||||
_, err = ParseAmount("1.234")
|
||||
assert.NotNil(t, err)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user