format.go 782 B

12345678910111213141516171819202122232425262728293031323334
  1. package format
  2. import (
  3. "fmt"
  4. "math"
  5. "strconv"
  6. )
  7. const (
  8. Thousand = 1000
  9. Million = Thousand * 1000
  10. Billion = Million * 1000
  11. )
  12. func HumanNumber(b uint64) string {
  13. switch {
  14. case b >= Billion:
  15. number := float64(b) / Billion
  16. if number == math.Floor(number) {
  17. return fmt.Sprintf("%.0fB", number) // no decimals if whole number
  18. }
  19. return fmt.Sprintf("%.1fB", number) // one decimal if not a whole number
  20. case b >= Million:
  21. number := float64(b) / Million
  22. if number == math.Floor(number) {
  23. return fmt.Sprintf("%.0fM", number) // no decimals if whole number
  24. }
  25. return fmt.Sprintf("%.2fM", number) // two decimals if not a whole number
  26. case b >= Thousand:
  27. return fmt.Sprintf("%.0fK", float64(b)/Thousand)
  28. default:
  29. return strconv.FormatUint(b, 10)
  30. }
  31. }