140 lines
2.7 KiB
Go
140 lines
2.7 KiB
Go
//
|
|
// conv_helper.go
|
|
// Copyright (C) 2022 tiglog <me@tiglog.com>
|
|
//
|
|
// Distributed under terms of the MIT license.
|
|
//
|
|
|
|
package helper
|
|
|
|
import (
|
|
"strconv"
|
|
"unsafe"
|
|
)
|
|
|
|
func AnyToInt(val any, dv int) (int, error) {
|
|
switch val.(type) {
|
|
case int:
|
|
rv, _ := val.(int)
|
|
return rv, nil
|
|
case int8:
|
|
rv, _ := val.(int8)
|
|
return int(rv), nil
|
|
case int16:
|
|
rv, _ := val.(int16)
|
|
return int(rv), nil
|
|
case int32:
|
|
rv, _ := val.(int32)
|
|
return int(rv), nil
|
|
case int64:
|
|
rv, _ := val.(int64)
|
|
return int(rv), nil
|
|
case string:
|
|
sv, _ := val.(string)
|
|
rv, err := strconv.Atoi(sv)
|
|
if err != nil {
|
|
return dv, err
|
|
}
|
|
return rv, nil
|
|
case float32:
|
|
rv, _ := val.(float32)
|
|
return int(rv), nil
|
|
case float64:
|
|
rv, _ := val.(float64)
|
|
return int(rv), nil
|
|
}
|
|
return dv, nil
|
|
}
|
|
|
|
func AnyToFloat(val any, dv float64) (float64, error) {
|
|
|
|
switch val.(type) {
|
|
case int:
|
|
iv, _ := val.(int)
|
|
return float64(iv), nil
|
|
case int8:
|
|
iv, _ := val.(int8)
|
|
return float64(iv), nil
|
|
case int16:
|
|
iv, _ := val.(int16)
|
|
return float64(iv), nil
|
|
case int32:
|
|
iv, _ := val.(int32)
|
|
return float64(iv), nil
|
|
case int64:
|
|
iv, _ := val.(int64)
|
|
return float64(iv), nil
|
|
case string:
|
|
sv, _ := val.(string)
|
|
return strconv.ParseFloat(sv, 64)
|
|
case float32:
|
|
fv, _ := val.(float32)
|
|
return float64(fv), nil
|
|
case float64:
|
|
fv, _ := val.(float64)
|
|
return fv, nil
|
|
|
|
}
|
|
return dv, nil
|
|
}
|
|
|
|
// 只处理简单数据类型
|
|
func AnyToString(val any, dv string) (string, error) {
|
|
switch val.(type) {
|
|
case string:
|
|
sv, _ := val.(string)
|
|
return sv, nil
|
|
case int:
|
|
iv, _ := val.(int)
|
|
return strconv.Itoa(iv), nil
|
|
case int8:
|
|
iv, _ := val.(int8)
|
|
return strconv.FormatInt(int64(iv), 10), nil
|
|
case int16:
|
|
iv, _ := val.(int16)
|
|
return strconv.FormatInt(int64(iv), 10), nil
|
|
case int32:
|
|
iv, _ := val.(int32)
|
|
return strconv.FormatInt(int64(iv), 10), nil
|
|
case int64:
|
|
iv, _ := val.(int64)
|
|
return strconv.FormatInt(iv, 10), nil
|
|
case float32:
|
|
fv, _ := val.(float32)
|
|
return strconv.FormatFloat(float64(fv), 'f', -1, 64), nil
|
|
case float64:
|
|
fv, _ := val.(float64)
|
|
return strconv.FormatFloat(fv, 'f', -1, 64), nil
|
|
case bool:
|
|
bv, _ := val.(bool)
|
|
if bv {
|
|
return "true", nil
|
|
}
|
|
return "false", nil
|
|
|
|
}
|
|
|
|
return dv, nil
|
|
}
|
|
|
|
// BytesToString converts byte slice to string.
|
|
func BytesToString(b []byte) string {
|
|
return *(*string)(unsafe.Pointer(&b))
|
|
}
|
|
|
|
func Atoi(b []byte) (int, error) {
|
|
return strconv.Atoi(BytesToString(b))
|
|
}
|
|
|
|
func ParseInt(b []byte, base int, bitSize int) (int64, error) {
|
|
return strconv.ParseInt(BytesToString(b), base, bitSize)
|
|
}
|
|
|
|
func ParseUint(b []byte, base int, bitSize int) (uint64, error) {
|
|
return strconv.ParseUint(BytesToString(b), base, bitSize)
|
|
}
|
|
|
|
func ParseFloat(b []byte, bitSize int) (float64, error) {
|
|
return strconv.ParseFloat(BytesToString(b), bitSize)
|
|
}
|