mirror of
https://gitee.com/johng/gf
synced 2026-06-06 16:21:40 +08:00
117 lines
2.9 KiB
Go
117 lines
2.9 KiB
Go
// Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
|
|
//
|
|
// This Source Code Form is subject to the terms of the MIT License.
|
|
// If a copy of the MIT was not distributed with this file,
|
|
// You can obtain one at https://github.com/gogf/gf.
|
|
|
|
package gconv
|
|
|
|
import (
|
|
"reflect"
|
|
"strconv"
|
|
|
|
"github.com/gogf/gf/v2/encoding/gbinary"
|
|
"github.com/gogf/gf/v2/util/gconv/internal/localinterface"
|
|
)
|
|
|
|
// Float32 converts `any` to float32.
|
|
func Float32(any interface{}) float32 {
|
|
if any == nil {
|
|
return 0
|
|
}
|
|
switch value := any.(type) {
|
|
case float32:
|
|
return value
|
|
case float64:
|
|
return float32(value)
|
|
case []byte:
|
|
// TODO: It might panic here for these types.
|
|
return gbinary.DecodeToFloat32(value)
|
|
default:
|
|
rv := reflect.ValueOf(any)
|
|
switch rv.Kind() {
|
|
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
|
return float32(rv.Int())
|
|
case reflect.Uintptr, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
|
|
return float32(rv.Uint())
|
|
case reflect.Float32, reflect.Float64:
|
|
return float32(rv.Float())
|
|
case reflect.Bool:
|
|
if rv.Bool() {
|
|
return 1
|
|
}
|
|
return 0
|
|
case reflect.String:
|
|
f, _ := strconv.ParseFloat(rv.String(), 32)
|
|
return float32(f)
|
|
case reflect.Ptr:
|
|
if rv.IsNil() {
|
|
return 0
|
|
}
|
|
if f, ok := value.(localinterface.IFloat32); ok {
|
|
return f.Float32()
|
|
}
|
|
return Float32(rv.Elem().Interface())
|
|
default:
|
|
if f, ok := value.(localinterface.IFloat32); ok {
|
|
return f.Float32()
|
|
}
|
|
v, _ := strconv.ParseFloat(String(any), 32)
|
|
return float32(v)
|
|
}
|
|
}
|
|
}
|
|
|
|
// Float64 converts `any` to float64.
|
|
func Float64(any interface{}) float64 {
|
|
if any == nil {
|
|
return 0
|
|
}
|
|
switch value := any.(type) {
|
|
case float32:
|
|
return float64(value)
|
|
case float64:
|
|
return value
|
|
case []byte:
|
|
// TODO: It might panic here for these types.
|
|
return gbinary.DecodeToFloat64(value)
|
|
default:
|
|
rv := reflect.ValueOf(any)
|
|
switch rv.Kind() {
|
|
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
|
return float64(rv.Int())
|
|
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
|
|
return float64(rv.Uint())
|
|
case reflect.Uintptr:
|
|
return float64(rv.Uint())
|
|
case reflect.Float32, reflect.Float64:
|
|
// Please Note:
|
|
// When the type is float32 or a custom type defined based on float32,
|
|
// switching to float64 may result in a few extra decimal places.
|
|
return rv.Float()
|
|
case reflect.Bool:
|
|
if rv.Bool() {
|
|
return 1
|
|
}
|
|
return 0
|
|
case reflect.String:
|
|
f, _ := strconv.ParseFloat(rv.String(), 64)
|
|
return f
|
|
case reflect.Ptr:
|
|
if rv.IsNil() {
|
|
return 0
|
|
}
|
|
if f, ok := value.(localinterface.IFloat64); ok {
|
|
return f.Float64()
|
|
}
|
|
return Float64(rv.Elem().Interface())
|
|
default:
|
|
if f, ok := value.(localinterface.IFloat64); ok {
|
|
return f.Float64()
|
|
}
|
|
v, _ := strconv.ParseFloat(String(any), 64)
|
|
return v
|
|
}
|
|
}
|
|
}
|