package mathutil
import (
"fmt"
"math"
"reflect"
"strconv"
"strings"
"time"
"github.com/gookit/goutil/comdef"
"github.com/gookit/goutil/internal/checkfn"
)
func Int (in any ) (int , error ) { return ToInt (in ) }
func SafeInt (in any ) int {
val , _ := ToInt (in )
return val
}
func QuietInt (in any ) int { return SafeInt (in ) }
func IntOrPanic (in any ) int {
val , err := ToInt (in )
if err != nil {
panic (err )
}
return val
}
func MustInt (in any ) int { return IntOrPanic (in ) }
func IntOrDefault (in any , defVal int ) int { return IntOr (in , defVal ) }
func IntOr (in any , defVal int ) int {
val , err := ToIntWith (in )
if err != nil {
return defVal
}
return val
}
func IntOrErr (in any ) (int , error ) { return ToIntWith (in ) }
func ToInt (in any ) (int , error ) { return ToIntWith (in ) }
func ToIntWith (in any , optFns ...ConvOptionFn [int ]) (iVal int , err error ) {
if len (optFns ) == 0 && in == nil {
return 0 , nil
}
var opt *ConvOption [int ]
if len (optFns ) > 0 {
opt = NewConvOption (optFns ...)
if in == nil && opt .NilAsFail {
err = comdef .ErrConvType
return
}
}
if tVal , ok := in .(string ); ok {
if opt != nil && opt .StrictMode {
err = comdef .ErrConvType
return
}
iVal , err = TryStrInt (tVal )
return
}
switch tVal := in .(type ) {
case int :
iVal = tVal
case *int :
iVal = *tVal
case int8 :
iVal = int (tVal )
case int16 :
iVal = int (tVal )
case int32 :
iVal = int (tVal )
case int64 :
if tVal > math .MaxInt32 {
err = fmt .Errorf ("value overflow int32. input: %v" , tVal )
} else {
iVal = int (tVal )
}
case uint :
if tVal > math .MaxInt32 {
err = fmt .Errorf ("value overflow int32. input: %v" , tVal )
} else {
iVal = int (tVal )
}
case uint8 :
iVal = int (tVal )
case uint16 :
iVal = int (tVal )
case uint32 :
if tVal > math .MaxInt32 {
err = fmt .Errorf ("value overflow int32. input: %v" , tVal )
} else {
iVal = int (tVal )
}
case uint64 :
if tVal > math .MaxInt32 {
err = fmt .Errorf ("value overflow int32. input: %v" , tVal )
} else {
iVal = int (tVal )
}
case float32 :
iVal = int (tVal )
case float64 :
iVal = int (tVal )
case time .Duration :
if tVal > math .MaxInt32 {
err = fmt .Errorf ("value overflow int32. input: %v" , tVal )
} else {
iVal = int (tVal )
}
case comdef .Int64able :
var i64 int64
if i64 , err = tVal .Int64 (); err == nil {
if i64 > math .MaxInt32 {
err = fmt .Errorf ("value overflow int32. input: %v" , tVal )
} else {
iVal = int (i64 )
}
}
default :
if opt == nil {
err = comdef .ErrConvType
return
}
if opt .UserConvFn != nil {
iVal , err = opt .UserConvFn (in )
} else if opt .HandlePtr {
if rv := reflect .ValueOf (in ); rv .Kind () == reflect .Pointer {
rv = rv .Elem ()
if checkfn .IsSimpleKind (rv .Kind ()) {
return ToIntWith (rv .Interface (), optFns ...)
}
}
} else {
err = comdef .ErrConvType
}
}
return
}
func Int64 (in any ) (int64 , error ) { return ToInt64 (in ) }
func SafeInt64 (in any ) int64 {
i64 , _ := ToInt64With (in )
return i64
}
func QuietInt64 (in any ) int64 { return SafeInt64 (in ) }
func MustInt64 (in any ) int64 {
i64 , err := ToInt64With (in )
if err != nil {
panic (err )
}
return i64
}
func Int64OrDefault (in any , defVal int64 ) int64 { return Int64Or (in , defVal ) }
func Int64Or (in any , defVal int64 ) int64 {
i64 , err := ToInt64With (in )
if err != nil {
return defVal
}
return i64
}
func ToInt64 (in any ) (int64 , error ) { return ToInt64With (in ) }
func Int64OrErr (in any ) (int64 , error ) { return ToInt64With (in ) }
func ToInt64With (in any , optFns ...ConvOptionFn [int64 ]) (i64 int64 , err error ) {
if len (optFns ) == 0 && in == nil {
return 0 , nil
}
var opt *ConvOption [int64 ]
if len (optFns ) > 0 {
opt = NewConvOption (optFns ...)
if in == nil && opt .NilAsFail {
err = comdef .ErrConvType
return
}
}
if tVal , ok := in .(string ); ok {
if opt != nil && opt .StrictMode {
err = comdef .ErrConvType
return
}
i64 , err = TryStrInt64 (tVal )
return
}
switch tVal := in .(type ) {
case int :
i64 = int64 (tVal )
case int8 :
i64 = int64 (tVal )
case int16 :
i64 = int64 (tVal )
case int32 :
i64 = int64 (tVal )
case int64 :
i64 = tVal
case *int64 :
i64 = *tVal
case uint :
i64 = int64 (tVal )
case uint8 :
i64 = int64 (tVal )
case uint16 :
i64 = int64 (tVal )
case uint32 :
i64 = int64 (tVal )
case uint64 :
i64 = int64 (tVal )
case float32 :
if opt != nil && opt .StrictMode {
err = comdef .ErrConvType
return
}
i64 = int64 (tVal )
case float64 :
if opt != nil && opt .StrictMode {
err = comdef .ErrConvType
return
}
if tVal > math .MaxInt64 {
err = comdef .ErrConvType
return
}
i64 = int64 (tVal )
case time .Duration :
i64 = int64 (tVal )
case comdef .Int64able :
i64 , err = tVal .Int64 ()
default :
if opt == nil {
err = comdef .ErrConvType
return
}
if opt .UserConvFn != nil {
i64 , err = opt .UserConvFn (in )
} else if opt .HandlePtr {
if rv := reflect .ValueOf (in ); rv .Kind () == reflect .Pointer {
rv = rv .Elem ()
if checkfn .IsSimpleKind (rv .Kind ()) {
return ToInt64With (rv .Interface (), optFns ...)
}
}
} else {
err = comdef .ErrConvType
}
}
return
}
func Uint (in any ) (uint , error ) { return ToUint (in ) }
func SafeUint (in any ) uint {
val , _ := ToUint (in )
return val
}
func QuietUint (in any ) uint { return SafeUint (in ) }
func MustUint (in any ) uint {
val , err := ToUintWith (in )
if err != nil {
panic (err )
}
return val
}
func UintOrDefault (in any , defVal uint ) uint { return UintOr (in , defVal ) }
func UintOr (in any , defVal uint ) uint {
val , err := ToUintWith (in )
if err != nil {
return defVal
}
return val
}
func UintOrErr (in any ) (uint , error ) { return ToUintWith (in ) }
func ToUint (in any ) (u64 uint , err error ) { return ToUintWith (in ) }
func ToUintWith (in any , optFns ...ConvOptionFn [uint ]) (uVal uint , err error ) {
if len (optFns ) == 0 && in == nil {
return 0 , nil
}
var opt *ConvOption [uint ]
if len (optFns ) > 0 {
opt = NewConvOption (optFns ...)
if in == nil && opt .NilAsFail {
err = comdef .ErrConvType
return
}
}
if tVal , ok := in .(string ); ok {
if opt != nil && opt .StrictMode {
err = comdef .ErrConvType
return
}
var u64 uint64
if u64 , err = TryStrUint64 (tVal ); err == nil {
uVal = uint (u64 )
}
return
}
switch tVal := in .(type ) {
case int :
uVal = uint (tVal )
case int8 :
uVal = uint (tVal )
case int16 :
uVal = uint (tVal )
case int32 :
uVal = uint (tVal )
case int64 :
uVal = uint (tVal )
case uint :
uVal = tVal
case *uint :
uVal = *tVal
case uint8 :
uVal = uint (tVal )
case uint16 :
uVal = uint (tVal )
case uint32 :
uVal = uint (tVal )
case uint64 :
uVal = uint (tVal )
case float32 :
uVal = uint (tVal )
case float64 :
uVal = uint (tVal )
case time .Duration :
uVal = uint (tVal )
case comdef .Int64able :
var i64 int64
i64 , err = tVal .Int64 ()
uVal = uint (i64 )
default :
if opt == nil {
err = comdef .ErrConvType
return
}
if opt .UserConvFn != nil {
uVal , err = opt .UserConvFn (in )
} else if opt .HandlePtr {
if rv := reflect .ValueOf (in ); rv .Kind () == reflect .Pointer {
rv = rv .Elem ()
if checkfn .IsSimpleKind (rv .Kind ()) {
return ToUintWith (rv .Interface (), optFns ...)
}
}
} else {
err = comdef .ErrConvType
}
}
return
}
func Uint64 (in any ) (uint64 , error ) { return ToUint64 (in ) }
func QuietUint64 (in any ) uint64 { return SafeUint64 (in ) }
func SafeUint64 (in any ) uint64 {
val , _ := ToUint64 (in )
return val
}
func MustUint64 (in any ) uint64 {
val , err := ToUint64With (in )
if err != nil {
panic (err )
}
return val
}
func Uint64OrDefault (in any , defVal uint64 ) uint64 { return Uint64Or (in , defVal ) }
func Uint64Or (in any , defVal uint64 ) uint64 {
val , err := ToUint64With (in )
if err != nil {
return defVal
}
return val
}
func Uint64OrErr (in any ) (uint64 , error ) { return ToUint64With (in ) }
func ToUint64 (in any ) (uint64 , error ) { return ToUint64With (in ) }
func ToUint64With (in any , optFns ...ConvOptionFn [uint64 ]) (u64 uint64 , err error ) {
if len (optFns ) == 0 && in == nil {
return 0 , nil
}
var opt *ConvOption [uint64 ]
if len (optFns ) > 0 {
opt = NewConvOption (optFns ...)
if in == nil && opt .NilAsFail {
err = comdef .ErrConvType
return
}
}
if tVal , ok := in .(string ); ok {
if opt != nil && opt .StrictMode {
err = comdef .ErrConvType
return
}
u64 , err = TryStrUint64 (tVal )
return
}
switch tVal := in .(type ) {
case int :
u64 = uint64 (tVal )
case int8 :
u64 = uint64 (tVal )
case int16 :
u64 = uint64 (tVal )
case int32 :
u64 = uint64 (tVal )
case int64 :
u64 = uint64 (tVal )
case uint :
u64 = uint64 (tVal )
case uint8 :
u64 = uint64 (tVal )
case uint16 :
u64 = uint64 (tVal )
case uint32 :
u64 = uint64 (tVal )
case uint64 :
u64 = tVal
case *uint64 :
u64 = *tVal
case float32 :
u64 = uint64 (tVal )
case float64 :
u64 = uint64 (tVal )
case time .Duration :
u64 = uint64 (tVal )
case comdef .Int64able :
var i64 int64
i64 , err = tVal .Int64 ()
u64 = uint64 (i64 )
default :
if opt == nil {
err = comdef .ErrConvType
return
}
if opt .UserConvFn != nil {
u64 , err = opt .UserConvFn (in )
} else if opt .HandlePtr {
if rv := reflect .ValueOf (in ); rv .Kind () == reflect .Pointer {
rv = rv .Elem ()
if checkfn .IsSimpleKind (rv .Kind ()) {
return ToUint64With (rv .Interface (), optFns ...)
}
}
} else {
err = comdef .ErrConvType
}
}
return
}
func StrInt (s string ) int {
iVal , _ := strconv .Atoi (strings .TrimSpace (s ))
return iVal
}
func StrIntOr (s string , defVal int ) int {
iVal , err := strconv .Atoi (strings .TrimSpace (s ))
if err != nil {
return defVal
}
return iVal
}
func TryStrInt (s string ) (int , error ) {
s = strings .TrimSpace (s )
if s == "" {
return 0 , nil
}
iVal , err := strconv .Atoi (s )
if err != nil && checkfn .IsNumeric (s ) {
var floatVal float64
if floatVal , err = strconv .ParseFloat (s , 64 ); err == nil {
iVal = int (math .Round (floatVal ))
err = nil
}
}
return iVal , err
}
func TryStrInt64 (s string ) (int64 , error ) {
s = strings .TrimSpace (s )
if s == "" {
return 0 , nil
}
i64 , err := strconv .ParseInt (s , 10 , 0 )
if err != nil && checkfn .IsNumeric (s ) {
var floatVal float64
if floatVal , err = strconv .ParseFloat (s , 64 ); err == nil {
i64 = int64 (math .Round (floatVal ))
err = nil
}
}
return i64 , err
}
func TryStrUint64 (s string ) (uint64 , error ) {
s = strings .TrimSpace (s )
if s == "" {
return 0 , nil
}
u64 , err := strconv .ParseUint (s , 10 , 0 )
if err != nil && checkfn .IsPositiveNum (s ) {
var floatVal float64
if floatVal , err = strconv .ParseFloat (s , 64 ); err == nil {
u64 = uint64 (math .Round (floatVal ))
err = nil
}
}
return u64 , err
}
The pages are generated with Golds v0.8.4 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .