From 33f01a753af59cb2ca0f6fdbc9ba81a133dbf68e Mon Sep 17 00:00:00 2001 From: Michael Ushakov Date: Wed, 15 Nov 2023 18:26:09 +0500 Subject: [PATCH 01/20] found place to arg format processing --- formatter.go | 15 ++++++++++++--- formatter_test.go | 19 +++++++++++++++++++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/formatter.go b/formatter.go index 227b24c..5878489 100644 --- a/formatter.go +++ b/formatter.go @@ -43,8 +43,8 @@ func Format(template string, args ...any) string { if i == templateLen-1 { break } - - if template[i+1] == '{' { // todo: umv: this not considering {{0}} + // considering in 2 phases - {{ }} + if template[i+1] == '{' { formattedStr.WriteByte('{') continue } @@ -74,12 +74,21 @@ func Format(template string, args ...any) string { i = j + 1 } else { argNumberStr := template[i+1 : j] + // is here we should support formatting ? var argNumber int var err error if len(argNumberStr) == 1 { - // this makes work a little faster than AtoI + // this calculation makes work a little faster than AtoI argNumber = int(argNumberStr[0] - '0') } else { + // Here we are going to process argument either with additional formatting or not + // i.e. 0 for arg without formatting && 0:format for an argument wit formatting + formatOptionIndex := strings.Index(argNumberStr, ":") + // formatOptionIndex can't be == 0, because 0 is a position of arg number + if formatOptionIndex > 0 { + // trim formatting string + // make formatting option str for further pass to an argument + } argNumber, err = strconv.Atoi(argNumberStr) } //argNumber, err := strconv.Atoi(argNumberStr) diff --git a/formatter_test.go b/formatter_test.go index 5c84577..66a4901 100644 --- a/formatter_test.go +++ b/formatter_test.go @@ -120,6 +120,25 @@ func TestFormat(t *testing.T) { } } +func TestFormatWithArgFormatting(t *testing.T) { + for name, test := range map[string]struct { + template string + args []any + expected string + }{ + "": { + template: "This is the text with an only number formatting: decimal - {0} / {0 : D6}, scientific - {1} / {1 : e2}", + args: []any{123, 191.0784}, + expected: "This is the text with an only number formatting: decimal - 123 / 000123, scientific - 1.91", + }, + } { + // Run test here + t.Run(name, func(t *testing.T) { + assert.Equal(t, test.expected, stringFormatter.Format(test.template, test.args...)) + }) + } +} + // TestStrFormatWithComplicatedText - this test represents issue with complicated text func TestFormatComplex(t *testing.T) { for name, test := range map[string]struct { From 4f6a0951a8f8c3f78977221c6aa9377ad6e40cf2 Mon Sep 17 00:00:00 2001 From: Michael Ushakov Date: Thu, 16 Nov 2023 15:41:30 +0500 Subject: [PATCH 02/20] obtain argument formatting --- formatter.go | 40 +++++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/formatter.go b/formatter.go index 5878489..25b2ffa 100644 --- a/formatter.go +++ b/formatter.go @@ -6,6 +6,8 @@ import ( "strings" ) +const argumentFormatSeparator = ":" + // Format /* Func that makes string formatting from template * It differs from above function only by generic interface that allow to use only primitive data types: @@ -77,24 +79,36 @@ func Format(template string, args ...any) string { // is here we should support formatting ? var argNumber int var err error + var argFormatOptions string if len(argNumberStr) == 1 { // this calculation makes work a little faster than AtoI argNumber = int(argNumberStr[0] - '0') } else { + argNumber = -1 // Here we are going to process argument either with additional formatting or not // i.e. 0 for arg without formatting && 0:format for an argument wit formatting - formatOptionIndex := strings.Index(argNumberStr, ":") + // todo(UMV): we could format json or yaml here ... + formatOptionIndex := strings.Index(argNumberStr, argumentFormatSeparator) // formatOptionIndex can't be == 0, because 0 is a position of arg number if formatOptionIndex > 0 { // trim formatting string + argParts := strings.Split(argNumberStr, argumentFormatSeparator) + argFormatOptions = strings.Trim(argParts[1], " ") + argNumber, err = strconv.Atoi(argParts[0]) + if err == nil { + argNumberStr = argParts[0] + } // make formatting option str for further pass to an argument } - argNumber, err = strconv.Atoi(argNumberStr) + // + if argNumber < 0 { + argNumber, err = strconv.Atoi(argNumberStr) + } } //argNumber, err := strconv.Atoi(argNumberStr) if err == nil && len(args) > argNumber { // get number from placeholder - strVal := getItemAsStr(&args[argNumber]) + strVal := getItemAsStr(&args[argNumber], &argFormatOptions) formattedStr.WriteString(strVal) } else { formattedStr.WriteByte('{') @@ -168,11 +182,22 @@ func FormatComplex(template string, args map[string]any) string { formattedStr.WriteString(template[i+1 : j+1]) i = j + 1 } else { + var argFormatOptions string argNumberStr := template[i+1 : j] + // i.e. 0 for arg without formatting && 0:format for an argument wit formatting + formatOptionIndex := strings.Index(argNumberStr, argumentFormatSeparator) + // formatOptionIndex can't be == 0, because 0 is a position of arg number + if formatOptionIndex > 0 { + // trim formatting string + argParts := strings.Split(argNumberStr, argumentFormatSeparator) + argFormatOptions = strings.Trim(argParts[1], " ") + argNumberStr = argParts[0] + // make formatting option str for further pass to an argument + } arg, ok := args[argNumberStr] if ok { // get number from placeholder - strVal := getItemAsStr(&arg) + strVal := getItemAsStr(&arg, &argFormatOptions) formattedStr.WriteString(strVal) } else { formattedStr.WriteByte('{') @@ -191,7 +216,7 @@ func FormatComplex(template string, args map[string]any) string { } // todo: umv: impl format passing as param -func getItemAsStr(item *any) string { +func getItemAsStr(item *any, itemFormat *string) string { switch v := (*item).(type) { case string: return v @@ -225,3 +250,8 @@ func getItemAsStr(item *any) string { return fmt.Sprintf("%v", v) } } + +/*func formatNumeric(item *any, itemFormat *string) string { + // 1. Determine what type of formatting is required + return "" +}*/ From 69d568689f523208b261996be668d73f950e32d2 Mon Sep 17 00:00:00 2001 From: Michael Ushakov Date: Thu, 16 Nov 2023 16:55:48 +0500 Subject: [PATCH 03/20] Util for benchmarks running --- utils/run_benchamrks.ps1 | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 utils/run_benchamrks.ps1 diff --git a/utils/run_benchamrks.ps1 b/utils/run_benchamrks.ps1 new file mode 100644 index 0000000..f34a737 --- /dev/null +++ b/utils/run_benchamrks.ps1 @@ -0,0 +1,5 @@ +$root_dir = Resolve-Path -Path ".." +echo "******** 1. standadrd fmt formatting lib benchmarks ******** " +go test $root_dir -bench=Fmt -benchmem -cpu 1 +echo "******** 2. stringFormatter lib benchmarks ******** " +go test $root_dir -bench=Format -benchmem -cpu 1 \ No newline at end of file From e01ab33e7501f5a6200ad9f4a51f0fd8ab1b06c2 Mon Sep 17 00:00:00 2001 From: Michael Ushakov Date: Wed, 27 Dec 2023 18:41:23 +0500 Subject: [PATCH 04/20] additional formatting started to work --- formatter.go | 123 +++++++++++++++++++++++++++++++++++++--------- formatter_test.go | 3 +- 2 files changed, 102 insertions(+), 24 deletions(-) diff --git a/formatter.go b/formatter.go index 25b2ffa..17ab294 100644 --- a/formatter.go +++ b/formatter.go @@ -38,6 +38,7 @@ func Format(template string, args ...any) string { formattedStr.Grow(templateLen + 22*len(args)) j := -1 //nolint:ineffassign + nestedBrackets := false formattedStr.WriteString(template[:start]) for i := start; i < templateLen; i++ { if template[i] == '{' { @@ -59,6 +60,7 @@ func Format(template string, args ...any) string { if template[j] == '{' { // multiple nested curly brackets ... + nestedBrackets = true formattedStr.WriteString(template[i:j]) i = j } @@ -94,7 +96,7 @@ func Format(template string, args ...any) string { // trim formatting string argParts := strings.Split(argNumberStr, argumentFormatSeparator) argFormatOptions = strings.Trim(argParts[1], " ") - argNumber, err = strconv.Atoi(argParts[0]) + argNumber, err = strconv.Atoi(strings.Trim(argParts[0], " ")) if err == nil { argNumberStr = argParts[0] } @@ -105,8 +107,9 @@ func Format(template string, args ...any) string { argNumber, err = strconv.Atoi(argNumberStr) } } - //argNumber, err := strconv.Atoi(argNumberStr) - if err == nil && len(args) > argNumber { + //_, err2 := strconv.Atoi(argNumberStr) + if (err == nil || (argFormatOptions != "" && !nestedBrackets)) && + len(args) > argNumber { // get number from placeholder strVal := getItemAsStr(&args[argNumber], &argFormatOptions) formattedStr.WriteString(strVal) @@ -147,6 +150,7 @@ func FormatComplex(template string, args map[string]any) string { formattedStr := &strings.Builder{} formattedStr.Grow(templateLen + 22*len(args)) j := -1 //nolint:ineffassign + //nestedBrackets := false formattedStr.WriteString(template[:start]) for i := start; i < templateLen; i++ { if template[i] == '{' { @@ -168,6 +172,7 @@ func FormatComplex(template string, args map[string]any) string { } if template[j] == '{' { // multiple nested curly brackets ... + //nestedBrackets = true formattedStr.WriteString(template[i:j]) i = j } @@ -217,41 +222,113 @@ func FormatComplex(template string, args map[string]any) string { // todo: umv: impl format passing as param func getItemAsStr(item *any, itemFormat *string) string { + base := 10 + var floatFormat byte = 'f' + precision := -1 + var preparedArgFormat string + var argStr string + postProcessingRequired := false + intNumberFormat := false + + if itemFormat != nil && len(*itemFormat) > 0 { + /* for numbers there are following formats: + * d(D) - decimal + * b(B) - binary + * e(E) - exponential + * f(F) - fixed point, {0,F4}, 123.15 -> 123.1500 + * p(P) - percent i.e. {0:P100}, 12 -> 12% + * Following formats are not supported yet: + * 1. c(C) currency it requires also country code + * 2. g(G),and others with locales + */ + preparedArgFormat = strings.ToLower(*itemFormat) + postProcessingRequired = len(preparedArgFormat) > 1 + + switch rune(preparedArgFormat[0]) { + case 'd': + base = 10 + intNumberFormat = true + case 'h': + base = 16 + intNumberFormat = true + case 'o': + base = 8 + intNumberFormat = true + case 'b': + base = 2 + intNumberFormat = true + case 'e': + // todo(define) precision ... + floatFormat = 'e' + // precision was passed, take [1:end], extract precision + if postProcessingRequired { + precisionStr := preparedArgFormat[1:] + precisionVal, err := strconv.Atoi(precisionStr) + if err == nil { + precision = precisionVal + } + } + postProcessingRequired = false + default: + base = 10 + } + } + switch v := (*item).(type) { case string: - return v + argStr = v case int8: - return strconv.FormatInt(int64(v), 10) + argStr = strconv.FormatInt(int64(v), base) case int16: - return strconv.FormatInt(int64(v), 10) + argStr = strconv.FormatInt(int64(v), base) case int32: - return strconv.FormatInt(int64(v), 10) + argStr = strconv.FormatInt(int64(v), base) case int64: - return strconv.FormatInt(v, 10) + argStr = strconv.FormatInt(v, base) case int: - return strconv.FormatInt(int64(v), 10) + argStr = strconv.FormatInt(int64(v), base) case uint8: - return strconv.FormatUint(uint64(v), 10) + argStr = strconv.FormatUint(uint64(v), base) case uint16: - return strconv.FormatUint(uint64(v), 10) + argStr = strconv.FormatUint(uint64(v), base) case uint32: - return strconv.FormatUint(uint64(v), 10) + argStr = strconv.FormatUint(uint64(v), base) case uint64: - return strconv.FormatUint(v, 10) + argStr = strconv.FormatUint(v, base) case uint: - return strconv.FormatUint(uint64(v), 10) + argStr = strconv.FormatUint(uint64(v), base) case bool: - return strconv.FormatBool(v) + argStr = strconv.FormatBool(v) case float32: - return strconv.FormatFloat(float64(v), 'f', -1, 32) + argStr = strconv.FormatFloat(float64(v), floatFormat, precision, 32) case float64: - return strconv.FormatFloat(v, 'f', -1, 64) + argStr = strconv.FormatFloat(v, floatFormat, precision, 64) default: - return fmt.Sprintf("%v", v) + argStr = fmt.Sprintf("%v", v) } -} -/*func formatNumeric(item *any, itemFormat *string) string { - // 1. Determine what type of formatting is required - return "" -}*/ + if !postProcessingRequired { + return argStr + } + + // 1. If integer numbers add filling + if intNumberFormat { + symbolsStr := preparedArgFormat[1:] + symbolsStrVal, err := strconv.Atoi(symbolsStr) + if err == nil { + symbolsToAdd := symbolsStrVal - len(argStr) + if symbolsToAdd > 0 { + advArgStr := &strings.Builder{} + advArgStr.Grow(len(argStr) + symbolsToAdd) + + for i := 0; i < symbolsToAdd; i++ { + advArgStr.WriteByte('0') + } + advArgStr.WriteString(argStr) + return advArgStr.String() + } + } + } + + return argStr +} diff --git a/formatter_test.go b/formatter_test.go index 66a4901..0a61792 100644 --- a/formatter_test.go +++ b/formatter_test.go @@ -129,11 +129,12 @@ func TestFormatWithArgFormatting(t *testing.T) { "": { template: "This is the text with an only number formatting: decimal - {0} / {0 : D6}, scientific - {1} / {1 : e2}", args: []any{123, 191.0784}, - expected: "This is the text with an only number formatting: decimal - 123 / 000123, scientific - 1.91", + expected: "This is the text with an only number formatting: decimal - 123 / 000123, scientific - 191.0784 / 1.91e+02", }, } { // Run test here t.Run(name, func(t *testing.T) { + // assert.NotNil(t, test) assert.Equal(t, test.expected, stringFormatter.Format(test.template, test.args...)) }) } From d58a03bcf9d578829d563f65ae57680aa5accdc7 Mon Sep 17 00:00:00 2001 From: Michael Ushakov Date: Wed, 27 Dec 2023 18:50:08 +0500 Subject: [PATCH 05/20] formatting && !brackets usage in a FormatComplex (no test yet) --- formatter.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/formatter.go b/formatter.go index 17ab294..77db92a 100644 --- a/formatter.go +++ b/formatter.go @@ -150,7 +150,7 @@ func FormatComplex(template string, args map[string]any) string { formattedStr := &strings.Builder{} formattedStr.Grow(templateLen + 22*len(args)) j := -1 //nolint:ineffassign - //nestedBrackets := false + nestedBrackets := false formattedStr.WriteString(template[:start]) for i := start; i < templateLen; i++ { if template[i] == '{' { @@ -172,7 +172,7 @@ func FormatComplex(template string, args map[string]any) string { } if template[j] == '{' { // multiple nested curly brackets ... - //nestedBrackets = true + nestedBrackets = true formattedStr.WriteString(template[i:j]) i = j } @@ -196,11 +196,11 @@ func FormatComplex(template string, args map[string]any) string { // trim formatting string argParts := strings.Split(argNumberStr, argumentFormatSeparator) argFormatOptions = strings.Trim(argParts[1], " ") - argNumberStr = argParts[0] + argNumberStr = strings.Trim(argParts[0], " ") // make formatting option str for further pass to an argument } arg, ok := args[argNumberStr] - if ok { + if ok || (argFormatOptions != "" && !nestedBrackets) { // get number from placeholder strVal := getItemAsStr(&arg, &argFormatOptions) formattedStr.WriteString(strVal) From 5b9adac6460a2332b8d099ceb2d19cf15f61b2f9 Mon Sep 17 00:00:00 2001 From: Michael Ushakov Date: Wed, 27 Dec 2023 22:19:52 +0500 Subject: [PATCH 06/20] added test on bin+hex formatting (Format) --- formatter.go | 4 +++- formatter_test.go | 7 ++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/formatter.go b/formatter.go index 77db92a..b3582d9 100644 --- a/formatter.go +++ b/formatter.go @@ -240,6 +240,8 @@ func getItemAsStr(item *any, itemFormat *string) string { * Following formats are not supported yet: * 1. c(C) currency it requires also country code * 2. g(G),and others with locales + * OUR own addition: + * 1. O(o) - octahedral number format */ preparedArgFormat = strings.ToLower(*itemFormat) postProcessingRequired = len(preparedArgFormat) > 1 @@ -248,7 +250,7 @@ func getItemAsStr(item *any, itemFormat *string) string { case 'd': base = 10 intNumberFormat = true - case 'h': + case 'x': base = 16 intNumberFormat = true case 'o': diff --git a/formatter_test.go b/formatter_test.go index 0a61792..e5846a1 100644 --- a/formatter_test.go +++ b/formatter_test.go @@ -126,11 +126,16 @@ func TestFormatWithArgFormatting(t *testing.T) { args []any expected string }{ - "": { + "numeric_test_1": { template: "This is the text with an only number formatting: decimal - {0} / {0 : D6}, scientific - {1} / {1 : e2}", args: []any{123, 191.0784}, expected: "This is the text with an only number formatting: decimal - 123 / 000123, scientific - 191.0784 / 1.91e+02", }, + "numeric_test_2": { + template: "This is the text with an only number formatting: binary - {0:B} / {0 : B8}, hexadecimal - {1:X} / {1 : X4}", + args: []any{15, 250}, + expected: "This is the text with an only number formatting: binary - 1111 / 00001111, hexadecimal - fa / 00fa", + }, } { // Run test here t.Run(name, func(t *testing.T) { From 8525e4b5ecddf0e655349f72be0a3f9dbde41aee Mon Sep 17 00:00:00 2001 From: Michael Ushakov Date: Wed, 27 Dec 2023 22:26:34 +0500 Subject: [PATCH 07/20] formats clarification , F not supported temporarily --- formatter.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/formatter.go b/formatter.go index b3582d9..b4b16fe 100644 --- a/formatter.go +++ b/formatter.go @@ -235,11 +235,12 @@ func getItemAsStr(item *any, itemFormat *string) string { * d(D) - decimal * b(B) - binary * e(E) - exponential - * f(F) - fixed point, {0,F4}, 123.15 -> 123.1500 + * x(X) - hexadecimal i.e. {0:X} 250 -> fa, {0:X4} 250 - 00fa * p(P) - percent i.e. {0:P100}, 12 -> 12% * Following formats are not supported yet: * 1. c(C) currency it requires also country code * 2. g(G),and others with locales + * 3. f(F) - fixed point, {0,F4}, 123.15 -> 123.1500 * OUR own addition: * 1. O(o) - octahedral number format */ @@ -260,7 +261,6 @@ func getItemAsStr(item *any, itemFormat *string) string { base = 2 intNumberFormat = true case 'e': - // todo(define) precision ... floatFormat = 'e' // precision was passed, take [1:end], extract precision if postProcessingRequired { @@ -271,6 +271,8 @@ func getItemAsStr(item *any, itemFormat *string) string { } } postProcessingRequired = false + case 'p': + // percentage processes here ... default: base = 10 } From 123909d82af4b9194348446631b48c97113c16da Mon Sep 17 00:00:00 2001 From: Michael Ushakov Date: Thu, 28 Dec 2023 15:10:52 +0500 Subject: [PATCH 08/20] testing F (fixed point) format option --- formatter.go | 17 ++++++++++++++--- formatter_test.go | 5 +++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/formatter.go b/formatter.go index b4b16fe..95fcb20 100644 --- a/formatter.go +++ b/formatter.go @@ -220,7 +220,6 @@ func FormatComplex(template string, args map[string]any) string { return formattedStr.String() } -// todo: umv: impl format passing as param func getItemAsStr(item *any, itemFormat *string) string { base := 10 var floatFormat byte = 'f' @@ -229,13 +228,15 @@ func getItemAsStr(item *any, itemFormat *string) string { var argStr string postProcessingRequired := false intNumberFormat := false + // floatNumberFormat := false if itemFormat != nil && len(*itemFormat) > 0 { /* for numbers there are following formats: * d(D) - decimal * b(B) - binary - * e(E) - exponential - * x(X) - hexadecimal i.e. {0:X} 250 -> fa, {0:X4} 250 - 00fa + * f(F) - fixed point i.e {0:F}, 10.5467890 -> 10.546789 ; {0:F4}, 10.5467890 -> 10.5468 + * e(E) - exponential - float point with scientific format {0:E2}, 191.0784 -> 1.91e+02 + * x(X) - hexadecimal i.e. {0:X}, 250 -> fa ; {0:X4}, 250 -> 00fa * p(P) - percent i.e. {0:P100}, 12 -> 12% * Following formats are not supported yet: * 1. c(C) currency it requires also country code @@ -271,6 +272,16 @@ func getItemAsStr(item *any, itemFormat *string) string { } } postProcessingRequired = false + case 'f': + if postProcessingRequired { + precisionStr := preparedArgFormat[1:] + precisionVal, err := strconv.Atoi(precisionStr) + if err == nil { + precision = precisionVal + } + } + postProcessingRequired = false + //floatNumberFormat = true case 'p': // percentage processes here ... default: diff --git a/formatter_test.go b/formatter_test.go index e5846a1..ea4fb79 100644 --- a/formatter_test.go +++ b/formatter_test.go @@ -136,6 +136,11 @@ func TestFormatWithArgFormatting(t *testing.T) { args: []any{15, 250}, expected: "This is the text with an only number formatting: binary - 1111 / 00001111, hexadecimal - fa / 00fa", }, + "numeric_test_3": { + template: "This is the text with an only number formatting: decimal - {0:F} / {0 : F4}", + args: []any{10.5467890}, + expected: "This is the text with an only number formatting: decimal - 10.546789 / 10.5468", + }, } { // Run test here t.Run(name, func(t *testing.T) { From 723c7ab3ac2bb4f0356cd43a80e73266cbde8b0f Mon Sep 17 00:00:00 2001 From: Michael Ushakov Date: Thu, 28 Dec 2023 15:23:49 +0500 Subject: [PATCH 09/20] a little bit of code amount reduction --- formatter.go | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/formatter.go b/formatter.go index 95fcb20..f280274 100644 --- a/formatter.go +++ b/formatter.go @@ -228,7 +228,7 @@ func getItemAsStr(item *any, itemFormat *string) string { var argStr string postProcessingRequired := false intNumberFormat := false - // floatNumberFormat := false + floatNumberFormat := false if itemFormat != nil && len(*itemFormat) > 0 { /* for numbers there are following formats: @@ -261,18 +261,11 @@ func getItemAsStr(item *any, itemFormat *string) string { case 'b': base = 2 intNumberFormat = true - case 'e': - floatFormat = 'e' - // precision was passed, take [1:end], extract precision - if postProcessingRequired { - precisionStr := preparedArgFormat[1:] - precisionVal, err := strconv.Atoi(precisionStr) - if err == nil { - precision = precisionVal - } + case 'e', 'f': + if rune(preparedArgFormat[0]) == 'e' { + floatFormat = 'e' } - postProcessingRequired = false - case 'f': + // precision was passed, take [1:end], extract precision if postProcessingRequired { precisionStr := preparedArgFormat[1:] precisionVal, err := strconv.Atoi(precisionStr) @@ -281,7 +274,8 @@ func getItemAsStr(item *any, itemFormat *string) string { } } postProcessingRequired = false - //floatNumberFormat = true + floatNumberFormat = preparedArgFormat[0] == 'f' + case 'p': // percentage processes here ... default: @@ -345,5 +339,9 @@ func getItemAsStr(item *any, itemFormat *string) string { } } + if floatNumberFormat { + // implement ... + } + return argStr } From a0fcfb1a2838bf363cd8f58a01b59f3e67579167 Mon Sep 17 00:00:00 2001 From: Michael Ushakov Date: Thu, 28 Dec 2023 21:40:50 +0500 Subject: [PATCH 10/20] Percentage processing too --- formatter.go | 21 +++++++++++++++++++++ formatter_test.go | 5 +++++ 2 files changed, 26 insertions(+) diff --git a/formatter.go b/formatter.go index f280274..aef2dd8 100644 --- a/formatter.go +++ b/formatter.go @@ -278,6 +278,27 @@ func getItemAsStr(item *any, itemFormat *string) string { case 'p': // percentage processes here ... + if postProcessingRequired { + dividerStr := preparedArgFormat[1:] + dividerVal, err := strconv.ParseFloat(dividerStr, 32) + if err == nil { + // 1. Convert arg to float + val := (*item).(interface{}) + var floatVal float64 + switch val.(type) { + case float64: + floatVal = val.(float64) + case int: + floatVal = float64(val.(int)) + default: + floatVal = 0 + } + // 2. Divide arg / divider and multiply by 100 + percentage := (floatVal / dividerVal) * 100 + return strconv.FormatFloat(percentage, floatFormat, 2, 64) + } + } + default: base = 10 } diff --git a/formatter_test.go b/formatter_test.go index ea4fb79..c76da2d 100644 --- a/formatter_test.go +++ b/formatter_test.go @@ -141,6 +141,11 @@ func TestFormatWithArgFormatting(t *testing.T) { args: []any{10.5467890}, expected: "This is the text with an only number formatting: decimal - 10.546789 / 10.5468", }, + "numeric_test_4": { + template: "This is the text with percentage format - {0:P100} / {0 : P100.5}, and non normal percentage {1:P100}", + args: []any{12, "ass"}, + expected: "This is the text with percentage format - 12.00 / 11.94, and non normal percentage 0.00", + }, } { // Run test here t.Run(name, func(t *testing.T) { From 3db392ec85b445fd43eef3c33415f94a6f37cefd Mon Sep 17 00:00:00 2001 From: Michael Ushakov Date: Thu, 28 Dec 2023 22:13:08 +0500 Subject: [PATCH 11/20] seems that last post processing case is ready --- formatter.go | 14 ++++++++++++-- formatter_test.go | 4 ++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/formatter.go b/formatter.go index aef2dd8..fdb1b50 100644 --- a/formatter.go +++ b/formatter.go @@ -360,8 +360,18 @@ func getItemAsStr(item *any, itemFormat *string) string { } } - if floatNumberFormat { - // implement ... + if floatNumberFormat && precision > 0 { + pointIndex := strings.Index(argStr, ".") + if pointIndex > 0 { + advArgStr := &strings.Builder{} + advArgStr.Grow(len(argStr) + precision) + advArgStr.WriteString(argStr) + numberOfSymbolsAfterPoint := len(argStr) - (pointIndex + 1) + for i := numberOfSymbolsAfterPoint; i < precision; i++ { + advArgStr.WriteByte(0) + } + return advArgStr.String() + } } return argStr diff --git a/formatter_test.go b/formatter_test.go index c76da2d..581ca34 100644 --- a/formatter_test.go +++ b/formatter_test.go @@ -137,9 +137,9 @@ func TestFormatWithArgFormatting(t *testing.T) { expected: "This is the text with an only number formatting: binary - 1111 / 00001111, hexadecimal - fa / 00fa", }, "numeric_test_3": { - template: "This is the text with an only number formatting: decimal - {0:F} / {0 : F4}", + template: "This is the text with an only number formatting: decimal - {0:F} / {0 : F4} / {0:F8}", args: []any{10.5467890}, - expected: "This is the text with an only number formatting: decimal - 10.546789 / 10.5468", + expected: "This is the text with an only number formatting: decimal - 10.546789 / 10.5468 / 10.54678900", }, "numeric_test_4": { template: "This is the text with percentage format - {0:P100} / {0 : P100.5}, and non normal percentage {1:P100}", From 1b871681a6e48509767f1c9beddedec416f832ac Mon Sep 17 00:00:00 2001 From: Michael Ushakov Date: Sat, 30 Dec 2023 00:22:04 +0500 Subject: [PATCH 12/20] Format args in complex started to work too --- formatter.go | 9 ++------- formatter_test.go | 20 +++++++++++++++++++- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/formatter.go b/formatter.go index fdb1b50..4be9f30 100644 --- a/formatter.go +++ b/formatter.go @@ -189,15 +189,10 @@ func FormatComplex(template string, args map[string]any) string { } else { var argFormatOptions string argNumberStr := template[i+1 : j] - // i.e. 0 for arg without formatting && 0:format for an argument wit formatting - formatOptionIndex := strings.Index(argNumberStr, argumentFormatSeparator) - // formatOptionIndex can't be == 0, because 0 is a position of arg number - if formatOptionIndex > 0 { - // trim formatting string - argParts := strings.Split(argNumberStr, argumentFormatSeparator) + argParts := strings.Split(argNumberStr, argumentFormatSeparator) + if len(argParts) > 1 { argFormatOptions = strings.Trim(argParts[1], " ") argNumberStr = strings.Trim(argParts[0], " ") - // make formatting option str for further pass to an argument } arg, ok := args[argNumberStr] if ok || (argFormatOptions != "" && !nestedBrackets) { diff --git a/formatter_test.go b/formatter_test.go index 581ca34..712ea09 100644 --- a/formatter_test.go +++ b/formatter_test.go @@ -162,7 +162,7 @@ func TestFormatComplex(t *testing.T) { args map[string]any expected string }{ - "format json": { + "numeric_test_1": { template: ` { "Comment": "Call Lambda with GRPC", @@ -198,3 +198,21 @@ func TestFormatComplex(t *testing.T) { }) } } + +func TestFormatComplexWithArgFormatting(t *testing.T) { + for name, test := range map[string]struct { + template string + args map[string]any + expected string + }{ + "numeric_test_1": { + template: "This is the text with an only number formatting: scientific - {mass} / {mass : e2}", + args: map[string]any{"mass": 191.0784}, + expected: "This is the text with an only number formatting: scientific - 191.0784 / 1.91e+02", + }, + } { + t.Run(name, func(t *testing.T) { + assert.Equal(t, test.expected, stringFormatter.FormatComplex(test.template, test.args)) + }) + } +} From b5ccfd2dd12a935b8f11f10a90cfcfb908e24433 Mon Sep 17 00:00:00 2001 From: Michael Ushakov Date: Sat, 30 Dec 2023 00:26:49 +0500 Subject: [PATCH 13/20] additional complex formatting test case --- formatter_test.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/formatter_test.go b/formatter_test.go index 712ea09..0bcb90c 100644 --- a/formatter_test.go +++ b/formatter_test.go @@ -210,6 +210,11 @@ func TestFormatComplexWithArgFormatting(t *testing.T) { args: map[string]any{"mass": 191.0784}, expected: "This is the text with an only number formatting: scientific - 191.0784 / 1.91e+02", }, + "numeric_test_2": { + template: "This is the text with an only number formatting: binary - {bin:B} / {bin : B8}, hexadecimal - {hex:X} / {hex : X4}", + args: map[string]any{"bin": 15, "hex": 250}, + expected: "This is the text with an only number formatting: binary - 1111 / 00001111, hexadecimal - fa / 00fa", + }, } { t.Run(name, func(t *testing.T) { assert.Equal(t, test.expected, stringFormatter.FormatComplex(test.template, test.args)) From 76cee5555840caa4d0033aacc8e1826d495685fb Mon Sep 17 00:00:00 2001 From: Michael Ushakov Date: Sat, 30 Dec 2023 00:30:13 +0500 Subject: [PATCH 14/20] seems there is enough tests on formatComplex too --- formatter_test.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/formatter_test.go b/formatter_test.go index 0bcb90c..0ea7804 100644 --- a/formatter_test.go +++ b/formatter_test.go @@ -215,6 +215,11 @@ func TestFormatComplexWithArgFormatting(t *testing.T) { args: map[string]any{"bin": 15, "hex": 250}, expected: "This is the text with an only number formatting: binary - 1111 / 00001111, hexadecimal - fa / 00fa", }, + "numeric_test_3": { + template: "This is the text with an only number formatting: decimal - {float:F} / {float : F4} / {float:F8}", + args: map[string]any{"float": 10.5467890}, + expected: "This is the text with an only number formatting: decimal - 10.546789 / 10.5468 / 10.54678900", + }, } { t.Run(name, func(t *testing.T) { assert.Equal(t, test.expected, stringFormatter.FormatComplex(test.template, test.args)) From ee6a2c69ce273d96f134a96e615f2410afb5a562 Mon Sep 17 00:00:00 2001 From: Michael Ushakov Date: Sat, 30 Dec 2023 00:35:49 +0500 Subject: [PATCH 15/20] perf tune for format complex --- formatter.go | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/formatter.go b/formatter.go index 4be9f30..d335c93 100644 --- a/formatter.go +++ b/formatter.go @@ -189,12 +189,15 @@ func FormatComplex(template string, args map[string]any) string { } else { var argFormatOptions string argNumberStr := template[i+1 : j] - argParts := strings.Split(argNumberStr, argumentFormatSeparator) - if len(argParts) > 1 { - argFormatOptions = strings.Trim(argParts[1], " ") - argNumberStr = strings.Trim(argParts[0], " ") - } arg, ok := args[argNumberStr] + if !ok { + argParts := strings.Split(argNumberStr, argumentFormatSeparator) + if len(argParts) > 1 { + argFormatOptions = strings.Trim(argParts[1], " ") + argNumberStr = strings.Trim(argParts[0], " ") + } + arg, ok = args[argNumberStr] + } if ok || (argFormatOptions != "" && !nestedBrackets) { // get number from placeholder strVal := getItemAsStr(&arg, &argFormatOptions) From a7b87cc9ef2240e36b29c4eca5ed28d13cf667db Mon Sep 17 00:00:00 2001 From: Michael Ushakov Date: Tue, 2 Jan 2024 00:48:21 +0500 Subject: [PATCH 16/20] less elegancy but ~ 100 units faster --- formatter.go | 26 +++++++++++++------------- formatter_benchmark_test.go | 18 ++++++++++++++++++ 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/formatter.go b/formatter.go index d335c93..7b072a3 100644 --- a/formatter.go +++ b/formatter.go @@ -243,24 +243,24 @@ func getItemAsStr(item *any, itemFormat *string) string { * OUR own addition: * 1. O(o) - octahedral number format */ - preparedArgFormat = strings.ToLower(*itemFormat) + preparedArgFormat = *itemFormat postProcessingRequired = len(preparedArgFormat) > 1 - switch rune(preparedArgFormat[0]) { - case 'd': + switch rune((*itemFormat)[0]) { + case 'd', 'D': base = 10 intNumberFormat = true - case 'x': + case 'x', 'X': base = 16 intNumberFormat = true - case 'o': + case 'o', 'O': base = 8 intNumberFormat = true - case 'b': + case 'b', 'B': base = 2 intNumberFormat = true - case 'e', 'f': - if rune(preparedArgFormat[0]) == 'e' { + case 'e', 'E', 'f', 'F': + if rune(preparedArgFormat[0]) == 'e' || rune(preparedArgFormat[0]) == 'E' { floatFormat = 'e' } // precision was passed, take [1:end], extract precision @@ -274,7 +274,7 @@ func getItemAsStr(item *any, itemFormat *string) string { postProcessingRequired = false floatNumberFormat = preparedArgFormat[0] == 'f' - case 'p': + case 'p', 'P': // percentage processes here ... if postProcessingRequired { dividerStr := preparedArgFormat[1:] @@ -346,8 +346,8 @@ func getItemAsStr(item *any, itemFormat *string) string { if err == nil { symbolsToAdd := symbolsStrVal - len(argStr) if symbolsToAdd > 0 { - advArgStr := &strings.Builder{} - advArgStr.Grow(len(argStr) + symbolsToAdd) + advArgStr := strings.Builder{} + advArgStr.Grow(len(argStr) + symbolsToAdd + 1) for i := 0; i < symbolsToAdd; i++ { advArgStr.WriteByte('0') @@ -361,8 +361,8 @@ func getItemAsStr(item *any, itemFormat *string) string { if floatNumberFormat && precision > 0 { pointIndex := strings.Index(argStr, ".") if pointIndex > 0 { - advArgStr := &strings.Builder{} - advArgStr.Grow(len(argStr) + precision) + advArgStr := strings.Builder{} + advArgStr.Grow(len(argStr) + precision + 1) advArgStr.WriteString(argStr) numberOfSymbolsAfterPoint := len(argStr) - (pointIndex + 1) for i := numberOfSymbolsAfterPoint; i < precision; i++ { diff --git a/formatter_benchmark_test.go b/formatter_benchmark_test.go index b7c706f..7913bed 100644 --- a/formatter_benchmark_test.go +++ b/formatter_benchmark_test.go @@ -15,6 +15,15 @@ func BenchmarkFormat4Arg(b *testing.B) { } } +func BenchmarkFormat4ArgAdvanced(b *testing.B) { + for i := 0; i < b.N; i++ { + _ = Format( + "Today is : {0}, atmosphere pressure is : {1:E2} mmHg, temperature: {2:E3}, location: {3}", + time.Now().String(), 725, -15.54, "Yekaterinburg", + ) + } +} + func BenchmarkFmt4Arg(b *testing.B) { for i := 0; i < b.N; i++ { _ = fmt.Sprintf( @@ -24,6 +33,15 @@ func BenchmarkFmt4Arg(b *testing.B) { } } +func BenchmarkFmt4ArgAdvanced(b *testing.B) { + for i := 0; i < b.N; i++ { + _ = fmt.Sprintf( + "Today is : %s, atmosphere pressure is : %.3e mmHg, temperature: %.2f, location: %s", + time.Now().String(), 725.0, -15.54, "Yekaterinburg", + ) + } +} + func BenchmarkFormat6Arg(b *testing.B) { for i := 0; i < b.N; i++ { _ = Format( From d0062db4f125fa769323c1d8a4a2dced100f32e9 Mon Sep 17 00:00:00 2001 From: Michael Ushakov Date: Tue, 2 Jan 2024 23:49:52 +0500 Subject: [PATCH 17/20] Yes, faster then fmt! --- formatter.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/formatter.go b/formatter.go index 7b072a3..adfd4cd 100644 --- a/formatter.go +++ b/formatter.go @@ -93,12 +93,12 @@ func Format(template string, args ...any) string { formatOptionIndex := strings.Index(argNumberStr, argumentFormatSeparator) // formatOptionIndex can't be == 0, because 0 is a position of arg number if formatOptionIndex > 0 { - // trim formatting string - argParts := strings.Split(argNumberStr, argumentFormatSeparator) - argFormatOptions = strings.Trim(argParts[1], " ") - argNumber, err = strconv.Atoi(strings.Trim(argParts[0], " ")) + // trim formatting string to remove spaces + argFormatOptions = strings.Trim(argNumberStr[formatOptionIndex+1:], " ") + argNumberStrPart := argNumberStr[:formatOptionIndex] + argNumber, err = strconv.Atoi(strings.Trim(argNumberStrPart, " ")) if err == nil { - argNumberStr = argParts[0] + argNumberStr = argNumberStrPart } // make formatting option str for further pass to an argument } @@ -107,7 +107,7 @@ func Format(template string, args ...any) string { argNumber, err = strconv.Atoi(argNumberStr) } } - //_, err2 := strconv.Atoi(argNumberStr) + if (err == nil || (argFormatOptions != "" && !nestedBrackets)) && len(args) > argNumber { // get number from placeholder @@ -272,7 +272,7 @@ func getItemAsStr(item *any, itemFormat *string) string { } } postProcessingRequired = false - floatNumberFormat = preparedArgFormat[0] == 'f' + floatNumberFormat = floatFormat == 'f' case 'p', 'P': // percentage processes here ... From eabcd11ebdb3874a0a5100095426ec307b9532c3 Mon Sep 17 00:00:00 2001 From: Michael Ushakov Date: Tue, 2 Jan 2024 23:57:16 +0500 Subject: [PATCH 18/20] did the same for the FormatComplex --- formatter.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/formatter.go b/formatter.go index adfd4cd..1859300 100644 --- a/formatter.go +++ b/formatter.go @@ -191,11 +191,12 @@ func FormatComplex(template string, args map[string]any) string { argNumberStr := template[i+1 : j] arg, ok := args[argNumberStr] if !ok { - argParts := strings.Split(argNumberStr, argumentFormatSeparator) - if len(argParts) > 1 { - argFormatOptions = strings.Trim(argParts[1], " ") - argNumberStr = strings.Trim(argParts[0], " ") + formatOptionIndex := strings.Index(argNumberStr, argumentFormatSeparator) + if formatOptionIndex >= 0 { + argFormatOptions = strings.Trim(argNumberStr[formatOptionIndex+1:], " ") + argNumberStr = strings.Trim(argNumberStr[:formatOptionIndex], " ") } + arg, ok = args[argNumberStr] } if ok || (argFormatOptions != "" && !nestedBrackets) { From b8176073c93353ec4cec4f988a89c41055722a1e Mon Sep 17 00:00:00 2001 From: Michael Ushakov Date: Wed, 3 Jan 2024 00:18:10 +0500 Subject: [PATCH 19/20] doc with perf tests && readme descr --- README.md | 16 ++++++++++++++-- img/benchmarks_adv.png | Bin 0 -> 94605 bytes 2 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 img/benchmarks_adv.png diff --git a/README.md b/README.md index 56557e2..3a0fce5 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ faster than `fmt`!!!. ## 1. Features 1. Text formatting with template using traditional for `C#, Python programmers style` - `{0}`, `{name}` that faster then fmt does: -![String Formatter: a convenient string formatting tool](/img/benchmarks2.png) +![String Formatter: a convenient string formatting tool](/img/benchmarks_adv.png) 2. Additional text utilities: - convert ***map to string*** using one of predefined formats (see `text_utils.go`) @@ -58,7 +58,19 @@ strFormatResult = stringFormatter.FormatComplex( ``` a result will be: `"Current app settings are: ipAddr: 127.0.0.1, port: 5432, use ssl: false."`` -#### 1.2.3 Benchmarks of the Format and FormatComplex functions +##### 1.2.3 Advanced arguments formatting + +For more convenient lines formatting we should choose how arguments are representing in output text, +`stringFormatter` supports following format options: +1. Bin number formatting + - `{0:B}, 15 outputs -> 1111` + - `{0:B8}, 15 outputs -> 00001111` +2. Hex number formatting +3. Oct number formatting +4. Float point number formatting +5. Percentage output + +##### 1.2.4 Benchmarks of the Format and FormatComplex functions benchmark could be running using following commands from command line: * to see `Format` result - `go test -bench=Format -benchmem -cpu 1` diff --git a/img/benchmarks_adv.png b/img/benchmarks_adv.png new file mode 100644 index 0000000000000000000000000000000000000000..e7d62657170fc8c077ee1a12d9df3e8af1fc44ca GIT binary patch literal 94605 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 Date: Wed, 3 Jan 2024 02:10:21 +0500 Subject: [PATCH 20/20] seems Readme is ready --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 3a0fce5..03d0d1a 100644 --- a/README.md +++ b/README.md @@ -66,9 +66,17 @@ For more convenient lines formatting we should choose how arguments are represen - `{0:B}, 15 outputs -> 1111` - `{0:B8}, 15 outputs -> 00001111` 2. Hex number formatting + - `{0:X}, 250 outputs -> fa` + - `{0:X4}, 250 outputs -> 00fa` 3. Oct number formatting + - `{0:o}, 11 outputs -> 14` 4. Float point number formatting + - `{0:E2}, 191.0478 outputs -> 1.91e+02` + - `{0:F}, 10.4567890 outputs -> 10.456789` + - `{0:F4}, 10.4567890 outputs -> 10.4568` + - `{0:F8}, 10.4567890 outputs -> 10.45678900` 5. Percentage output + - `{0:P100}, 12 outputs -> 12%` ##### 1.2.4 Benchmarks of the Format and FormatComplex functions