From 66dfd9c4fd02e225bd69959f7b76c131c49f913e Mon Sep 17 00:00:00 2001 From: dudaodong Date: Thu, 25 Jan 2024 16:45:17 +0800 Subject: [PATCH] refactor: refact Comma function --- formatter/formatter.go | 40 +++++++--------- formatter/formatter_internal.go | 85 --------------------------------- 2 files changed, 16 insertions(+), 109 deletions(-) delete mode 100644 formatter/formatter_internal.go diff --git a/formatter/formatter.go b/formatter/formatter.go index 6572e28..163d8d4 100644 --- a/formatter/formatter.go +++ b/formatter/formatter.go @@ -6,12 +6,11 @@ package formatter import ( "encoding/json" - "fmt" "io" + "strconv" + "strings" "github.com/duke-git/lancet/v2/convertor" - "github.com/duke-git/lancet/v2/strutil" - "github.com/duke-git/lancet/v2/validator" "golang.org/x/exp/constraints" ) @@ -20,31 +19,24 @@ import ( // Comma("12345", "$") => "$12,345", Comma(12345, "$") => "$12,345" // Play: https://go.dev/play/p/eRD5k2vzUVX func Comma[T constraints.Float | constraints.Integer | string](value T, symbol string) string { - if validator.IsInt(value) { - v, err := convertor.ToInt(value) - if err != nil { - return "" - } - return symbol + commaInt(v) - } + numString := convertor.ToString(value) - if validator.IsFloat(value) { - v, err := convertor.ToFloat(value) - if err != nil { - return "" - } - return symbol + commaFloat(v) - } - - if strutil.IsString(value) { - v := fmt.Sprintf("%v", value) - if validator.IsNumberStr(v) { - return symbol + commaStr(v) - } + _, err := strconv.ParseFloat(numString, 64) + if err != nil { return "" } - return "" + index := strings.Index(numString, ".") + if index == -1 { + index = len(numString) + } + + for index > 3 { + index = index - 3 + numString = numString[:index] + "," + numString[index:] + } + + return symbol + numString } // Pretty data to JSON string. diff --git a/formatter/formatter_internal.go b/formatter/formatter_internal.go deleted file mode 100644 index a602ac6..0000000 --- a/formatter/formatter_internal.go +++ /dev/null @@ -1,85 +0,0 @@ -package formatter - -import ( - "bytes" - "math" - "strconv" - "strings" -) - -// see https://github.com/dustin/go-humanize/blob/master/comma.go -func commaInt(v int64) string { - sign := "" - - // Min int64 can't be negated to a usable value, so it has to be special cased. - if v == math.MinInt64 { - return "-9,223,372,036,854,775,808" - } - - if v < 0 { - sign = "-" - v = 0 - v - } - - parts := []string{"", "", "", "", "", "", ""} - j := len(parts) - 1 - - for v > 999 { - parts[j] = strconv.FormatInt(v%1000, 10) - switch len(parts[j]) { - case 2: - parts[j] = "0" + parts[j] - case 1: - parts[j] = "00" + parts[j] - } - v = v / 1000 - j-- - } - parts[j] = strconv.Itoa(int(v)) - return sign + strings.Join(parts[j:], ",") -} - -func commaFloat(v float64) string { - buf := &bytes.Buffer{} - if v < 0 { - buf.Write([]byte{'-'}) - v = 0 - v - } - - comma := []byte{','} - - parts := strings.Split(strconv.FormatFloat(v, 'f', -1, 64), ".") - pos := 0 - if len(parts[0])%3 != 0 { - pos += len(parts[0]) % 3 - buf.WriteString(parts[0][:pos]) - buf.Write(comma) - } - for ; pos < len(parts[0]); pos += 3 { - buf.WriteString(parts[0][pos : pos+3]) - buf.Write(comma) - } - buf.Truncate(buf.Len() - 1) - - if len(parts) > 1 { - buf.Write([]byte{'.'}) - buf.WriteString(parts[1]) - } - return buf.String() -} - -func commaStr(s string) string { - dotIndex := strings.Index(s, ".") - if dotIndex != -1 { - return commaStrRecursive(s[:dotIndex]) + s[dotIndex:] - } - - return commaStrRecursive(s) -} - -func commaStrRecursive(s string) string { - if len(s) <= 3 { - return s - } - return commaStrRecursive(s[:len(s)-3]) + "," + commaStrRecursive(s[len(s)-3:]) -}