support importing transaction by csv/tsv file via command line

This commit is contained in:
MaysWind
2024-09-02 00:40:00 +08:00
parent 366311edbb
commit 7c59e8386e
27 changed files with 1496 additions and 208 deletions
+68 -1
View File
@@ -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
}
+130
View File
@@ -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)
}