github.com/profzone/eden-framework@v1.0.10/pkg/validate/validatetpl/float.go (about) 1 package validatetpl 2 3 import ( 4 "fmt" 5 "reflect" 6 "strings" 7 ) 8 9 func NewRangeValidateFloat32(min, max float32, exc_min, exc_max bool) func(v interface{}) (bool, string) { 10 return func(v interface{}) (bool, string) { 11 if reflect.TypeOf(v).Kind() == reflect.Float32 { 12 value := float32(reflect.ValueOf(v).Float()) 13 if value < min || value > max || (value == min && exc_min) || (value == max && exc_max) { 14 lb, rb := getBrackets(exc_min, exc_max) 15 return false, fmt.Sprintf(FLOAT_VALUE_NOT_IN_RANGE, lb, min, max, rb, value) 16 } 17 return true, "" 18 } 19 return false, TYPE_NOT_FLOAT32 20 } 21 } 22 func NewRangeValidateFloat64(min, max float64, exc_min, exc_max bool) func(v interface{}) (bool, string) { 23 return func(v interface{}) (bool, string) { 24 if reflect.TypeOf(v).Kind() == reflect.Float64 { 25 value := float64(reflect.ValueOf(v).Float()) 26 if value < min || value > max || (value == min && exc_min) || (value == max && exc_max) { 27 lb, rb := getBrackets(exc_min, exc_max) 28 return false, fmt.Sprintf(FLOAT_VALUE_NOT_IN_RANGE, lb, min, max, rb, value) 29 } 30 return true, "" 31 } 32 return false, TYPE_NOT_FLOAT64 33 } 34 } 35 func NewEnumValidateFloat32(enum_values ...float32) func(v interface{}) (bool, string) { 36 return func(v interface{}) (bool, string) { 37 if reflect.TypeOf(v).Kind() == reflect.Float32 { 38 value := float32(reflect.ValueOf(v).Float()) 39 for _, enum_value := range enum_values { 40 if value == float32(enum_value) { 41 return true, "" 42 } 43 } 44 return false, fmt.Sprintf(FLOAT_VALUE_NOT_IN_ENUM, enum_values, value) 45 } 46 return false, TYPE_NOT_FLOAT32 47 } 48 } 49 func NewEnumValidateFloat64(enum_values ...float64) func(v interface{}) (bool, string) { 50 return func(v interface{}) (bool, string) { 51 if reflect.TypeOf(v).Kind() == reflect.Float64 { 52 value := float64(reflect.ValueOf(v).Float()) 53 for _, enum_value := range enum_values { 54 if value == float64(enum_value) { 55 return true, "" 56 } 57 } 58 return false, fmt.Sprintf(FLOAT_VALUE_NOT_IN_ENUM, enum_values, value) 59 } 60 return false, TYPE_NOT_FLOAT64 61 } 62 } 63 64 func NewDecimalValidateFloat32(total_len, decimal_len int) func(v interface{}) (bool, string) { 65 return func(v interface{}) (bool, string) { 66 if reflect.TypeOf(v).Kind() == reflect.Float32 { 67 value := float32(reflect.ValueOf(v).Float()) 68 digits := strings.Split(fmt.Sprintf("%v", value), ".") 69 // 避免小数部分为0 70 if len(digits) == 1 { 71 digits = append(digits, "0") 72 } 73 // 正数部分最大长度 74 integer_len := total_len - decimal_len 75 // 整数部分,高位0不计算有效位 76 integer_digits := strings.TrimLeft(digits[0], "0") 77 // 小数部分,低位0不计算有效位 78 decimal_digits := strings.TrimRight(digits[1], "0") 79 if len(integer_digits) > integer_len || len(decimal_digits) > decimal_len { 80 return false, fmt.Sprintf(FLOAT_VALUE_DIGIT_INVALID, decimal_len, total_len, value) 81 } 82 return true, "" 83 } 84 return false, TYPE_NOT_FLOAT32 85 } 86 } 87 88 func NewDecimalValidateFloat64(total_len, decimal_len int) func(v interface{}) (bool, string) { 89 return func(v interface{}) (bool, string) { 90 if reflect.TypeOf(v).Kind() == reflect.Float64 { 91 value := float64(reflect.ValueOf(v).Float()) 92 digits := strings.Split(fmt.Sprintf("%v", value), ".") 93 // 避免小数部分为0 94 if len(digits) == 1 { 95 digits = append(digits, "0") 96 } 97 // 正数部分最大长度 98 integer_len := total_len - decimal_len 99 // 整数部分,高位0不计算有效位 100 integer_digits := strings.TrimLeft(digits[0], "0") 101 // 小数部分,低位0不计算有效位 102 decimal_digits := strings.TrimRight(digits[1], "0") 103 if len(integer_digits) > integer_len || len(decimal_digits) > decimal_len { 104 return false, fmt.Sprintf(FLOAT_VALUE_DIGIT_INVALID, decimal_len, total_len, value) 105 } 106 return true, "" 107 } 108 return false, TYPE_NOT_FLOAT64 109 } 110 }