blob: 7e6c652e140c6372d684ee564b60c5372de8848c [file] [log] [blame]
Serge Bazanskicc25bdf2018-10-25 14:02:58 +02001package govalidator
2
3import (
4 "math"
5 "reflect"
6)
7
8// Abs returns absolute value of number
9func Abs(value float64) float64 {
10 return math.Abs(value)
11}
12
13// Sign returns signum of number: 1 in case of value > 0, -1 in case of value < 0, 0 otherwise
14func Sign(value float64) float64 {
15 if value > 0 {
16 return 1
17 } else if value < 0 {
18 return -1
19 } else {
20 return 0
21 }
22}
23
24// IsNegative returns true if value < 0
25func IsNegative(value float64) bool {
26 return value < 0
27}
28
29// IsPositive returns true if value > 0
30func IsPositive(value float64) bool {
31 return value > 0
32}
33
34// IsNonNegative returns true if value >= 0
35func IsNonNegative(value float64) bool {
36 return value >= 0
37}
38
39// IsNonPositive returns true if value <= 0
40func IsNonPositive(value float64) bool {
41 return value <= 0
42}
43
44// InRange returns true if value lies between left and right border
45func InRangeInt(value, left, right interface{}) bool {
46 value64, _ := ToInt(value)
47 left64, _ := ToInt(left)
48 right64, _ := ToInt(right)
49 if left64 > right64 {
50 left64, right64 = right64, left64
51 }
52 return value64 >= left64 && value64 <= right64
53}
54
55// InRange returns true if value lies between left and right border
56func InRangeFloat32(value, left, right float32) bool {
57 if left > right {
58 left, right = right, left
59 }
60 return value >= left && value <= right
61}
62
63// InRange returns true if value lies between left and right border
64func InRangeFloat64(value, left, right float64) bool {
65 if left > right {
66 left, right = right, left
67 }
68 return value >= left && value <= right
69}
70
71// InRange returns true if value lies between left and right border, generic type to handle int, float32 or float64, all types must the same type
72func InRange(value interface{}, left interface{}, right interface{}) bool {
73
74 reflectValue := reflect.TypeOf(value).Kind()
75 reflectLeft := reflect.TypeOf(left).Kind()
76 reflectRight := reflect.TypeOf(right).Kind()
77
78 if reflectValue == reflect.Int && reflectLeft == reflect.Int && reflectRight == reflect.Int {
79 return InRangeInt(value.(int), left.(int), right.(int))
80 } else if reflectValue == reflect.Float32 && reflectLeft == reflect.Float32 && reflectRight == reflect.Float32 {
81 return InRangeFloat32(value.(float32), left.(float32), right.(float32))
82 } else if reflectValue == reflect.Float64 && reflectLeft == reflect.Float64 && reflectRight == reflect.Float64 {
83 return InRangeFloat64(value.(float64), left.(float64), right.(float64))
84 } else {
85 return false
86 }
87}
88
89// IsWhole returns true if value is whole number
90func IsWhole(value float64) bool {
91 return math.Remainder(value, 1) == 0
92}
93
94// IsNatural returns true if value is natural number (positive and whole)
95func IsNatural(value float64) bool {
96 return IsWhole(value) && IsPositive(value)
97}