Convert size to bytes 1KiB to 1024
.
import (
"strings"
"strconv"
)
func Pow(x int64, y int) int64 {
if y == 0 {
return 1
}
result := x
for n := 1; n < y; n++ {
result = result * x
}
return result
}
func ConvertSizeToBytes(s string) (string, error) {
// make lowercase so units detection always works
s = strings.TrimSpace(strings.ToLower(s))
// first look for binary units
for _, unit := range units2 {
if strings.HasSuffix(s, unit) {
s = strings.TrimSuffix(s, unit)
if i, err := strconv.ParseInt(s, 10, 0); err != nil {
return "", fmt.Errorf("invalid size value '%s': %v", s, err)
} else {
i = i * Pow(1024, lookupTable2[unit])
s = strconv.FormatInt(i, 10)
return s, nil
}
}
}
// fall back to SI units
for _, unit := range units10 {
if strings.HasSuffix(s, unit) {
s = strings.TrimSuffix(s, unit)
if i, err := strconv.ParseInt(s, 10, 0); err != nil {
return "", fmt.Errorf("invalid size value '%s': %v", s, err)
} else {
i = i * Pow(1000, lookupTable10[unit])
s = strconv.FormatInt(i, 10)
return s, nil
}
}
}
// no valid units found, so ensure the value is a number
if _, err := strconv.ParseUint(s, 10, 64); err != nil {
return "", fmt.Errorf("invalid size value '%s': %v", s, err)
}
return s, nil
}
How to use?
var k = "1KiB"
s, err := ConvertSizeToBytes(k)
// s = 1024