ordinalize.go 760 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. package flect
  2. import (
  3. "fmt"
  4. "strconv"
  5. )
  6. // Ordinalize converts a number to an ordinal version
  7. // 42 = 42nd
  8. // 45 = 45th
  9. // 1 = 1st
  10. func Ordinalize(s string) string {
  11. return New(s).Ordinalize().String()
  12. }
  13. // Ordinalize converts a number to an ordinal version
  14. // 42 = 42nd
  15. // 45 = 45th
  16. // 1 = 1st
  17. func (i Ident) Ordinalize() Ident {
  18. number, err := strconv.Atoi(i.Original)
  19. if err != nil {
  20. return i
  21. }
  22. var s string
  23. switch abs(number) % 100 {
  24. case 11, 12, 13:
  25. s = fmt.Sprintf("%dth", number)
  26. default:
  27. switch abs(number) % 10 {
  28. case 1:
  29. s = fmt.Sprintf("%dst", number)
  30. case 2:
  31. s = fmt.Sprintf("%dnd", number)
  32. case 3:
  33. s = fmt.Sprintf("%drd", number)
  34. }
  35. }
  36. if s != "" {
  37. return New(s)
  38. }
  39. return New(fmt.Sprintf("%dth", number))
  40. }