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  }