Files
proxmoxaas-common-lib/units.go
T
2026-06-26 20:38:01 +00:00

61 lines
1.3 KiB
Go

package proxmoxaas_common_lib
import (
"fmt"
"log"
"math"
"strings"
)
const Base1000 uint64 = 1000
const Base1024 uint64 = 1024
var prefixesBase1000 []string = []string{"", "K", "M", "G", "T"}
var prefixesBase1024 []string = []string{"", "Ki", "Mi", "Gi", "Ti"}
const KB uint64 = Base1000
const MB uint64 = KB * Base1000
const GB uint64 = MB * Base1000
const TB uint64 = GB * Base1000
const KiB uint64 = Base1024
const MiB uint64 = KiB * Base1024
const GiB uint64 = MiB * Base1024
const TiB uint64 = GiB * Base1024
func FormatNumber(val uint64, base uint64) (string, string) {
valf := float64(val)
basef := float64(base)
steps := 0
for math.Abs(valf) > basef && steps < 4 {
valf /= basef
steps++
}
switch base {
case Base1000:
s := fmt.Sprintf("%.4f", valf)
s = strings.TrimRight(s, "0")
s = strings.TrimRight(s, ".")
prefixes := prefixesBase1000
return s, prefixes[steps]
case Base1024:
s := fmt.Sprintf("%.4f", valf)
s = strings.TrimRight(s, "0")
s = strings.TrimRight(s, ".")
prefixes := prefixesBase1024
return s, prefixes[steps]
default:
return "0", ""
}
}
// Converts int, int32, and int64 to uint64. Less than 0 check.
func SafeUint64[I int | int32 | int64](i I) uint64 {
if i < 0 {
log.Printf("Tried to cast %d to uint64", i)
return 0
}
return uint64(i)
}