package utils
import (
"bufio"
"fmt"
"reflect"
"strconv"
"strings"
)
func FormatInt64(n int64) string {
const base = 10
return strconv.FormatInt(n, base)
}
func ParseInt64(str string) (int64, error) {
const (
base = 10
bitSize = 64
)
return strconv.ParseInt(str, base, bitSize)
}
func ParseFloat64(str string) (float64, error) {
const bitSize = 64
return strconv.ParseFloat(str, bitSize)
}
func ParseInt64Map(data string) (map[string]int64, error) {
var res = make(map[string]int64)
scanner := bufio.NewScanner(strings.NewReader(data))
for scanner.Scan() {
arr := strings.Fields(scanner.Text())
const defaultLength = 2
if len(arr) != defaultLength {
return nil, fmt.Errorf("failed to parse a single line into two strings %v", arr)
}
value, err := ParseInt64(arr[1])
if err != nil {
return nil, err
}
res[arr[0]] = value
}
return res, nil
}
func FormatFloat64(f float64) string {
const (
precision = -1
bitSize = 64
format = 'f'
)
return strconv.FormatFloat(f, format, precision, bitSize)
}
func PercentageToDecimal(num float64) float64 {
const percentageofOne float64 = 100
return Div(num, percentageofOne)
}
func DeepCopy(value interface{}) interface{} {
defer func() {
if err := recover(); err != nil {
fmt.Printf("err: %v\n", err)
}
}()
typ := reflect.TypeOf(value)
val := reflect.ValueOf(value)
switch typ.Kind() {
case reflect.Map:
newMap := reflect.MakeMapWithSize(typ, val.Len())
it := val.MapRange()
for it.Next() {
newMap.SetMapIndex(it.Key(), DeepCopy(it.Value()).(reflect.Value))
}
return newMap.Interface()
case reflect.Slice:
newSlice := reflect.MakeSlice(typ, val.Len(), val.Cap())
reflect.Copy(newSlice, val)
return newSlice.Interface()
default:
return value
}
}