diff --git a/cointop/portfolio.go b/cointop/portfolio.go index 0317040..b01feb8 100644 --- a/cointop/portfolio.go +++ b/cointop/portfolio.go @@ -12,6 +12,7 @@ import ( "time" "unicode/utf8" + "github.com/Knetic/govaluate" "github.com/miguelmota/cointop/pkg/asciitable" "github.com/miguelmota/cointop/pkg/humanize" "github.com/miguelmota/cointop/pkg/pad" @@ -434,16 +435,24 @@ func (ct *Cointop) SetPortfolioHoldings() error { return nil } - value := normalizeFloatString(string(b), true) - shouldDelete := value == "" - var holdings float64 - - if !shouldDelete { - holdings, err = strconv.ParseFloat(value, 64) + var holdings float64 = 0 + input := strings.TrimSpace(string(b[:n])) // remove trailing \0s + if input != "" { + expression, err := govaluate.NewEvaluableExpression(input) if err != nil { - return err + return nil // invalid expression - don't change anything + } + result, err := expression.Evaluate(nil) + if err != nil { + return nil // could not evaluate - don't change anything + } + var ok bool + holdings, ok = result.(float64) + if !ok { + return nil // not a float64 - don't change anything } } + shouldDelete := holdings == 0 idx := ct.GetPortfolioCoinIndex(coin) if err := ct.SetPortfolioEntry(coin.Name, holdings); err != nil { diff --git a/docs/content/faq.md b/docs/content/faq.md index 0392af4..fd32e45 100644 --- a/docs/content/faq.md +++ b/docs/content/faq.md @@ -165,6 +165,8 @@ draft: false Press e on the highlighted coin to enter holdings and add to your portfolio. + This dialog supports basic expressions including `+` `-` `*` etc. + ## How do I edit the holdings of a coin in my portfolio? Press e on the highlighted coin to edit the holdings. diff --git a/go.mod b/go.mod index 51f8410..9495c01 100644 --- a/go.mod +++ b/go.mod @@ -2,6 +2,7 @@ module github.com/miguelmota/cointop require ( github.com/BurntSushi/toml v0.3.1 + github.com/Knetic/govaluate v3.0.0+incompatible // indirect github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d github.com/anaskhan96/soup v1.1.1 // indirect github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be // indirect diff --git a/go.sum b/go.sum index c23e45c..30911b7 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,8 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/Knetic/govaluate v3.0.0+incompatible h1:7o6+MAPhYTCF0+fdvoz1xDedhRb4f6s9Tn1Tt7/WTEg= +github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat636LX7Bqt5lYEZ27JNDcqxfjdBQuJ/MM4CN/Lzo=