diff --git a/README.md b/README.md
index 9b2910f..14f5133 100644
--- a/README.md
+++ b/README.md
@@ -373,7 +373,10 @@ import "github.com/duke-git/lancet/v2/formatter"
#### Function list:
-- [Comma](https://github.com/duke-git/lancet/blob/main/docs/formatter.md#Comma)
+- **Comma** : add comma to a number value by every 3 numbers from right, ahead by symbol char.
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/formatter.md#Comma)]
+ [[play](https://go.dev/play/p/eRD5k2vzUVX)]
+
### 10. Function package can control the flow of function execution and support part of functional programming
diff --git a/README_zh-CN.md b/README_zh-CN.md
index b2fc8ff..2c86800 100644
--- a/README_zh-CN.md
+++ b/README_zh-CN.md
@@ -371,7 +371,11 @@ import "github.com/duke-git/lancet/v2/formatter"
#### 函数列表:
-- [Comma](https://github.com/duke-git/lancet/blob/main/docs/formatter_zh-CN.md#Comma)
+- **Comma** : 用逗号每隔3位分割数字/字符串,支持前缀添加符号。
+ [[doc](https://github.com/duke-git/lancet/blob/main/docs/formatter_zh-CN.md#Comma)]
+ [[play](https://go.dev/play/p/eRD5k2vzUVX)]
+
+
### 10. function 函数包控制函数执行流程,包含部分函数式编程。
diff --git a/formatter/formatter.go b/formatter/formatter.go
index be76085..a91c5c3 100644
--- a/formatter/formatter.go
+++ b/formatter/formatter.go
@@ -5,6 +5,9 @@
package formatter
import (
+ "fmt"
+ "reflect"
+ "strconv"
"strings"
"golang.org/x/exp/constraints"
@@ -13,6 +16,7 @@ import (
// Comma add comma to a number value by every 3 numbers from right. ahead by symbol char.
// if value is invalid number string eg "aa", return empty string
// 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 {
s, err := numberToString(value)
if err != nil {
@@ -26,3 +30,42 @@ func Comma[T constraints.Float | constraints.Integer | string](value T, symbol s
return symbol + commaString(s)
}
+
+func commaString(s string) string {
+ if len(s) <= 3 {
+ return s
+ }
+ return commaString(s[:len(s)-3]) + "," + commaString(s[len(s)-3:])
+}
+
+func numberToString(value any) (string, error) {
+ switch reflect.TypeOf(value).Kind() {
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
+ reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
+ return fmt.Sprintf("%v", value), nil
+
+ // todo: need to handle 12345678.9 => 1.23456789e+07
+ case reflect.Float32, reflect.Float64:
+ return fmt.Sprintf("%v", value), nil
+
+ case reflect.String:
+ {
+ sv := fmt.Sprintf("%v", value)
+ if strings.Contains(sv, ".") {
+ _, err := strconv.ParseFloat(sv, 64)
+ if err != nil {
+ return "", err
+ }
+ return sv, nil
+ } else {
+ _, err := strconv.ParseInt(sv, 10, 64)
+ if err != nil {
+ return "", nil
+ }
+ return sv, nil
+ }
+ }
+ default:
+ return "", nil
+ }
+}
diff --git a/formatter/formatter_example_test.go b/formatter/formatter_example_test.go
new file mode 100644
index 0000000..53162ad
--- /dev/null
+++ b/formatter/formatter_example_test.go
@@ -0,0 +1,18 @@
+package formatter
+
+import "fmt"
+
+func ExampleComma() {
+ result1 := Comma("123", "")
+ result2 := Comma("12345", "$")
+ result3 := Comma(1234567, "¥")
+
+ fmt.Println(result1)
+ fmt.Println(result2)
+ fmt.Println(result3)
+
+ // Output:
+ // 123
+ // $12,345
+ // ¥1,234,567
+}
diff --git a/formatter/formatter_internal.go b/formatter/formatter_internal.go
deleted file mode 100644
index 55be4aa..0000000
--- a/formatter/formatter_internal.go
+++ /dev/null
@@ -1,47 +0,0 @@
-package formatter
-
-import (
- "fmt"
- "reflect"
- "strconv"
- "strings"
-)
-
-func commaString(s string) string {
- if len(s) <= 3 {
- return s
- }
- return commaString(s[:len(s)-3]) + "," + commaString(s[len(s)-3:])
-}
-
-func numberToString(value any) (string, error) {
- switch reflect.TypeOf(value).Kind() {
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
- reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
- return fmt.Sprintf("%v", value), nil
-
- // todo: need to handle 12345678.9 => 1.23456789e+07
- case reflect.Float32, reflect.Float64:
- return fmt.Sprintf("%v", value), nil
-
- case reflect.String:
- {
- sv := fmt.Sprintf("%v", value)
- if strings.Contains(sv, ".") {
- _, err := strconv.ParseFloat(sv, 64)
- if err != nil {
- return "", err
- }
- return sv, nil
- } else {
- _, err := strconv.ParseInt(sv, 10, 64)
- if err != nil {
- return "", nil
- }
- return sv, nil
- }
- }
- default:
- return "", nil
- }
-}