From a240ea3367fab5385eaf62f1819054884570cf2e Mon Sep 17 00:00:00 2001 From: Josh Yan Date: Mon, 3 Jun 2024 17:26:02 -0700 Subject: [PATCH] humanNumbers formats to 3 digits, added trillion case for future --- format/format.go | 29 +++++++++++++++++++---------- format/format_test.go | 14 +++++++------- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/format/format.go b/format/format.go index 31059578f..268353348 100644 --- a/format/format.go +++ b/format/format.go @@ -2,32 +2,41 @@ package format import ( "fmt" - "math" ) const ( Thousand = 1000 Million = Thousand * 1000 Billion = Million * 1000 + Trillion = Billion * 1000 ) func HumanNumber(b uint64) string { switch { + case b >= Trillion: + number := float64(b) / Trillion + return fmt.Sprintf("%sT", DecimalPlace(number)) case b >= Billion: number := float64(b) / Billion - if number == math.Floor(number) { - return fmt.Sprintf("%.0fB", number) // no decimals if whole number - } - return fmt.Sprintf("%.1fB", number) // one decimal if not a whole number + return fmt.Sprintf("%sB", DecimalPlace(number)) case b >= Million: number := float64(b) / Million - if number == math.Floor(number) { - return fmt.Sprintf("%.0fM", number) // no decimals if whole number - } - return fmt.Sprintf("%.2fM", number) // two decimals if not a whole number + return fmt.Sprintf("%sM", DecimalPlace(number)) case b >= Thousand: - return fmt.Sprintf("%.0fK", float64(b)/Thousand) + number := float64(b) / Thousand + return fmt.Sprintf("%sK", DecimalPlace(number)) default: return fmt.Sprintf("%d", b) } } + +func DecimalPlace(number float64) string { + switch { + case number >= 100: + return fmt.Sprintf("%.0f", number) + case number >= 10: + return fmt.Sprintf("%.1f", number) + default: + return fmt.Sprintf("%.2f", number) + } +} diff --git a/format/format_test.go b/format/format_test.go index 1d73c80bd..c09837aef 100644 --- a/format/format_test.go +++ b/format/format_test.go @@ -13,14 +13,14 @@ func TestHumanNumber(t *testing.T) { testCases := []testCase{ {0, "0"}, - {1000000, "1M"}, + {1000000, "1.00M"}, {125000000, "125M"}, - {500500000, "500.50M"}, - {500550000, "500.55M"}, - {1000000000, "1B"}, - {2800000000, "2.8B"}, - {2850000000, "2.9B"}, - {1000000000000, "1000B"}, + {500500000, "500M"}, + {500550000, "501M"}, + {1000000000, "1.00B"}, + {2800000000, "2.80B"}, + {2850000000, "2.85B"}, + {1000000000000, "1.00T"}, } for _, tc := range testCases {