numerics.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package govalidator
  2. import (
  3. "math"
  4. )
  5. // Abs returns absolute value of number
  6. func Abs(value float64) float64 {
  7. return math.Abs(value)
  8. }
  9. // Sign returns signum of number: 1 in case of value > 0, -1 in case of value < 0, 0 otherwise
  10. func Sign(value float64) float64 {
  11. if value > 0 {
  12. return 1
  13. } else if value < 0 {
  14. return -1
  15. } else {
  16. return 0
  17. }
  18. }
  19. // IsNegative returns true if value < 0
  20. func IsNegative(value float64) bool {
  21. return value < 0
  22. }
  23. // IsPositive returns true if value > 0
  24. func IsPositive(value float64) bool {
  25. return value > 0
  26. }
  27. // IsNonNegative returns true if value >= 0
  28. func IsNonNegative(value float64) bool {
  29. return value >= 0
  30. }
  31. // IsNonPositive returns true if value <= 0
  32. func IsNonPositive(value float64) bool {
  33. return value <= 0
  34. }
  35. // InRangeInt returns true if value lies between left and right border
  36. func InRangeInt(value, left, right interface{}) bool {
  37. value64, _ := ToInt(value)
  38. left64, _ := ToInt(left)
  39. right64, _ := ToInt(right)
  40. if left64 > right64 {
  41. left64, right64 = right64, left64
  42. }
  43. return value64 >= left64 && value64 <= right64
  44. }
  45. // InRangeFloat32 returns true if value lies between left and right border
  46. func InRangeFloat32(value, left, right float32) bool {
  47. if left > right {
  48. left, right = right, left
  49. }
  50. return value >= left && value <= right
  51. }
  52. // InRangeFloat64 returns true if value lies between left and right border
  53. func InRangeFloat64(value, left, right float64) bool {
  54. if left > right {
  55. left, right = right, left
  56. }
  57. return value >= left && value <= right
  58. }
  59. // InRange returns true if value lies between left and right border, generic type to handle int, float32, float64 and string.
  60. // All types must the same type.
  61. // False if value doesn't lie in range or if it incompatible or not comparable
  62. func InRange(value interface{}, left interface{}, right interface{}) bool {
  63. switch value.(type) {
  64. case int:
  65. return InRangeInt(value.(int), left.(int), right.(int))
  66. case float32:
  67. return InRangeFloat32(value.(float32), left.(float32), right.(float32))
  68. case float64:
  69. return InRangeFloat64(value.(float64), left.(float64), right.(float64))
  70. case string:
  71. return value.(string) >= left.(string) && value.(string) <= right.(string)
  72. default:
  73. return false
  74. }
  75. }
  76. // IsWhole returns true if value is whole number
  77. func IsWhole(value float64) bool {
  78. return math.Remainder(value, 1) == 0
  79. }
  80. // IsNatural returns true if value is natural number (positive and whole)
  81. func IsNatural(value float64) bool {
  82. return IsWhole(value) && IsPositive(value)
  83. }