129 lines
3.1 KiB
Go
129 lines
3.1 KiB
Go
// Copyright (C) INFINI Labs & INFINI LIMITED.
|
|
//
|
|
// The INFINI Console is offered under the GNU Affero General Public License v3.0
|
|
// and as commercial software.
|
|
//
|
|
// For commercial licensing, contact us at:
|
|
// - Website: infinilabs.com
|
|
// - Email: hello@infini.ltd
|
|
//
|
|
// Open Source licensed under AGPL V3:
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU Affero General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU Affero General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Affero General Public License
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
/* Copyright © INFINI Ltd. All rights reserved.
|
|
* web: https://infinilabs.com
|
|
* mail: hello#infini.ltd */
|
|
|
|
package funcs
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"infini.sh/framework/core/util"
|
|
"reflect"
|
|
"strconv"
|
|
)
|
|
|
|
func toFixed(precision int, num float64) float64 {
|
|
return util.ToFixed(num, precision)
|
|
}
|
|
func add(a, b interface{}) float64 {
|
|
av := ToFloat64(a)
|
|
bv := ToFloat64(b)
|
|
return av + bv
|
|
}
|
|
func sub(a, b interface{}) float64 { return ToFloat64(a) - ToFloat64(b) }
|
|
func div(a, b interface{}) float64 { return ToFloat64(a) / ToFloat64(b) }
|
|
func mul(a interface{}, v ...interface{}) float64 {
|
|
val := ToFloat64(a)
|
|
for _, b := range v {
|
|
val = val * ToFloat64(b)
|
|
}
|
|
return val
|
|
}
|
|
|
|
// ToFloat64 casts an interface to a float64 type.
|
|
func ToFloat64(i interface{}) float64 {
|
|
v, _ := ToFloat64E(i)
|
|
return v
|
|
}
|
|
|
|
func indirect(a interface{}) interface{} {
|
|
if a == nil {
|
|
return nil
|
|
}
|
|
if t := reflect.TypeOf(a); t.Kind() != reflect.Ptr {
|
|
// Avoid creating a reflect.Value if it's not a pointer.
|
|
return a
|
|
}
|
|
v := reflect.ValueOf(a)
|
|
for v.Kind() == reflect.Ptr && !v.IsNil() {
|
|
v = v.Elem()
|
|
}
|
|
return v.Interface()
|
|
}
|
|
|
|
// ToFloat64E casts an interface to a float64 type.
|
|
func ToFloat64E(i interface{}) (float64, error) {
|
|
i = indirect(i)
|
|
|
|
switch s := i.(type) {
|
|
case float64:
|
|
return s, nil
|
|
case float32:
|
|
return float64(s), nil
|
|
case int:
|
|
return float64(s), nil
|
|
case int64:
|
|
return float64(s), nil
|
|
case int32:
|
|
return float64(s), nil
|
|
case int16:
|
|
return float64(s), nil
|
|
case int8:
|
|
return float64(s), nil
|
|
case uint:
|
|
return float64(s), nil
|
|
case uint64:
|
|
return float64(s), nil
|
|
case uint32:
|
|
return float64(s), nil
|
|
case uint16:
|
|
return float64(s), nil
|
|
case uint8:
|
|
return float64(s), nil
|
|
case string:
|
|
v, err := strconv.ParseFloat(s, 64)
|
|
if err == nil {
|
|
return v, nil
|
|
}
|
|
return 0, fmt.Errorf("unable to cast %#v of type %T to float64", i, i)
|
|
case json.Number:
|
|
v, err := s.Float64()
|
|
if err == nil {
|
|
return v, nil
|
|
}
|
|
return 0, fmt.Errorf("unable to cast %#v of type %T to float64", i, i)
|
|
case bool:
|
|
if s {
|
|
return 1, nil
|
|
}
|
|
return 0, nil
|
|
case nil:
|
|
return 0, nil
|
|
default:
|
|
return 0, fmt.Errorf("unable to cast %#v of type %T to float64", i, i)
|
|
}
|
|
}
|