Skip to content

Commit

Permalink
refactor: data/currencyutil: move Amount{} and Formatter{} to `…
Browse files Browse the repository at this point in the history
…xgo`
  • Loading branch information
grokify committed Nov 26, 2023
1 parent 1f736ba commit c1b24a1
Show file tree
Hide file tree
Showing 6 changed files with 122 additions and 19 deletions.
112 changes: 112 additions & 0 deletions data/currencyutil/amounts.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
package currencyutil

/*
import (
"fmt"
"regexp"
"strings"
"github.com/grokify/mogo/strconv/strconvutil"
"github.com/shopspring/decimal"
)
type Amounts []Amount
func (amts Amounts) Sum() (Amount, error) {
Expand All @@ -12,3 +22,105 @@ func (amts Amounts) Sum() (Amount, error) {
}
return sum, nil
}
type Amount struct {
Value decimal.Decimal
Unit string
}
var (
// rxUSD = regexp.MustCompile(`^USD?\s+\$([0-9,]+\.[0-9]{2})$`)
rxCUR = regexp.MustCompile(`^([A-Z]{1,3})\s+([^0-9])?([0-9,]+\.[0-9]{2})$`)
rxComma = regexp.MustCompile(`,`)
)
func NewAmountFloat(u string, v float64) (Amount, error) {
amt := Amount{
Value: decimal.NewFromFloat(v)}
can, err := ParseCurrencyUnit(u, "")
if err != nil {
return amt, err
}
amt.Unit = can
return amt, nil
}
func MustNewAmountInt(u string, v int64, exp int32) Amount {
amt, err := NewAmountInt(u, v, exp)
if err != nil {
panic(err)
}
return amt
}
func NewAmountInt(u string, v int64, exp int32) (Amount, error) {
amt := Amount{
Value: decimal.New(v, exp)}
can, err := ParseCurrencyUnit(u, "")
if err != nil {
return amt, err
}
amt.Unit = can
return amt, nil
}
func ParseAmount(value string) (Amount, error) {
value = strings.TrimSpace(value)
m := rxCUR.FindStringSubmatch(value)
pr := Amount{}
if len(m) > 0 {
digits := m[3]
digits = rxComma.ReplaceAllString(digits, "")
n, err := decimal.NewFromString(digits)
if err != nil {
return pr, err
}
pr.Value = n
cur, err := ParseCurrencyUnit(m[1], m[2])
if err != nil {
return pr, err
}
pr.Unit = cur
return pr, nil
}
return pr, fmt.Errorf("currency not found [%s]", value)
}
func (amt *Amount) Add(a Amount) error {
if a.Value.IsZero() {
return nil
}
amt.Unit = strings.ToUpper(strings.TrimSpace(amt.Unit))
a.Unit = strings.ToUpper(strings.TrimSpace(a.Unit))
if amt.Unit != a.Unit {
if amt.Value.IsZero() && amt.Unit == "" {
amt.Unit = a.Unit
} else {
return fmt.Errorf("mismatch currency units have (%s %v) adding (%s %v)", amt.Unit, amt.Value, a.Unit, a.Value)
}
}
amt.Value = amt.Value.Add(a.Value)
return nil
}
func (amt *Amount) Equal(a Amount) bool {
return amt.Value.Equal(a.Value) && amt.Unit == a.Unit
}
var rxIntPrefix = regexp.MustCompile(`^[0-9]+`)
func (amt Amount) MustStringFixed(places int32, defaultUnit string) string {
i := amt.Value.IntPart()
is := strconvutil.Commify(i)
if places < 1 {
return MustSymbol(amt.Unit) + is
}
exp := amt.Value.StringFixed(places)
exp = rxIntPrefix.ReplaceAllString(exp, "")
unit := strings.TrimSpace(amt.Unit)
if unit == "" {
unit = defaultUnit
}
return MustSymbol(unit) + is + exp
}
*/
2 changes: 2 additions & 0 deletions data/currencyutil/format.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package currencyutil

/*
import (
"strconv"
"strings"
Expand Down Expand Up @@ -49,3 +50,4 @@ func (f *Formatter) FormatMoneyString(symbol string, amountString string) (strin
}
return f.Accounting.FormatMoney(amountFloat), nil
}
*/
9 changes: 6 additions & 3 deletions data/currencyutil/parse.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,6 @@ import (
"regexp"
"strconv"
"strings"

"github.com/grokify/mogo/strconv/strconvutil"
"github.com/shopspring/decimal"
)

const (
Expand Down Expand Up @@ -117,6 +114,7 @@ func ParseCurrency(opts *ParseCurrencyOpts, s string) (string, float64, error) {
return currency, val, nil
}

/*
type Amount struct {
Value decimal.Decimal
Unit string
Expand Down Expand Up @@ -157,7 +155,9 @@ func NewAmountInt(u string, v int64, exp int32) (Amount, error) {
amt.Unit = can
return amt, nil
}
*/

/*
func ParseAmount(value string) (Amount, error) {
value = strings.TrimSpace(value)
m := rxCUR.FindStringSubmatch(value)
Expand All @@ -179,13 +179,15 @@ func ParseAmount(value string) (Amount, error) {
}
return pr, fmt.Errorf("currency not found [%s]", value)
}
*/

/*
func (amt *Amount) ValueInt() (int64, error) {
}
*/

/*()
func (amt *Amount) Add(a Amount) error {
if a.Value.IsZero() {
return nil
Expand Down Expand Up @@ -223,6 +225,7 @@ func (amt Amount) MustStringFixed(places int32, defaultUnit string) string {
}
return MustSymbol(unit) + is + exp
}
*/

func ParseCurrencyUnit(abbr, symbol string) (string, error) {
abbr = CurrencyCanonical(abbr)
Expand Down
2 changes: 2 additions & 0 deletions data/currencyutil/parse_test.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package currencyutil

/*
import (
"testing"
Expand Down Expand Up @@ -38,3 +39,4 @@ func TestParse(t *testing.T) {
}
}
}
*/
4 changes: 0 additions & 4 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,9 @@ require (
github.com/jessevdk/go-flags v1.5.0
github.com/joho/godotenv v1.5.1
github.com/json-iterator/go v1.1.12
github.com/leekchan/accounting v1.0.0
github.com/lytics/base62 v0.0.0-20180808010106-0ee4de5a5d6d
github.com/martinlindhe/base36 v1.1.1
github.com/microcosm-cc/bluemonday v1.0.26
github.com/shopspring/decimal v1.3.1
golang.org/x/crypto v0.15.0
golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa
golang.org/x/image v0.14.0
Expand All @@ -32,11 +30,9 @@ require (
require (
github.com/aymerick/douceur v0.2.0 // indirect
github.com/cloudflare/circl v1.3.6 // indirect
github.com/cockroachdb/apd v1.1.0 // indirect
github.com/gorilla/css v1.0.1 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/stretchr/testify v1.7.1 // indirect
golang.org/x/sys v0.14.0 // indirect
google.golang.org/protobuf v1.31.0 // indirect
Expand Down
12 changes: 0 additions & 12 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ github.com/caarlos0/env/v6 v6.10.1/go.mod h1:hvp/ryKXKipEkcuYjs9mI4bBCg+UI0Yhgm5
github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA=
github.com/cloudflare/circl v1.3.6 h1:/xbKIqSHbZXHwkhbrhrt2YOHIwYJlXH94E3tI/gDlUg=
github.com/cloudflare/circl v1.3.6/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA=
github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
Expand Down Expand Up @@ -39,10 +37,6 @@ github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/leekchan/accounting v1.0.0 h1:+Wd7dJ//dFPa28rc1hjyy+qzCbXPMR91Fb6F1VGTQHg=
github.com/leekchan/accounting v1.0.0/go.mod h1:3timm6YPhY3YDaGxl0q3eaflX0eoSx3FXn7ckHe4tO0=
github.com/lib/pq v1.0.0 h1:X5PMW56eZitiTeO7tKzZxFCSpbFZJtkMMooicw2us9A=
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/lytics/base62 v0.0.0-20180808010106-0ee4de5a5d6d h1:HONlVR8gkr5QibYNVFtj8ajfqRAKt21DmdzeZXZl6VQ=
github.com/lytics/base62 v0.0.0-20180808010106-0ee4de5a5d6d/go.mod h1:nFZ1y9JiUDciefRL0X6OTobqQGgFCR+lbnn1lWsoQk0=
github.com/martinlindhe/base36 v1.1.0/go.mod h1:+AtEs8xrBpCeYgSLoY/aJ6Wf37jtBuR0s35750M27+8=
Expand All @@ -55,14 +49,8 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8=
github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
Expand Down

0 comments on commit c1b24a1

Please sign in to comment.