Skip to content

Instantly share code, notes, and snippets.

@kougazhang
Last active August 30, 2021 00:55
Show Gist options
  • Save kougazhang/6c7524928ffbb91d73b26803d0160e71 to your computer and use it in GitHub Desktop.
Save kougazhang/6c7524928ffbb91d73b26803d0160e71 to your computer and use it in GitHub Desktop.
#golang
var dataUnitPattern, _ = regexp.Compile(`(\d+)\s*([a-zA-Z]+)`)
func ParseDataStorage(s string) (int64, error) {
all := dataUnitPattern.FindAllStringSubmatch(s, -1)
if len(all) != 1 || len(all[0]) != 3 {
return 0, fmt.Errorf("invalid %s", s)
}
d, u := all[0][1], all[0][2]
num, err := strconv.ParseInt(d, 10, 32)
if err != nil {
return 0, errors.Wrapf(err, "invalid %s", s)
}
switch strings.ToUpper(u) {
case "BYTES":
return num * 1, nil
case "KB":
return num * 1024, nil
case "MB":
return num * 1024 * 1024, nil
case "GB":
return num * 1024 * 1024 * 1024, nil
case "TB":
return num * 1024 * 1024 * 1024 * 1024, nil
default:
return 0, fmt.Errorf("unknown unit %s", u)
}
}
func TestParseDataUnit(t *testing.T) {
data, err := ParseDataStorage("100MB")
assert.Equal(t, err, nil)
assert.Equal(t, data, int64(100*1024*1024))
data, err = ParseDataStorage("100mB")
assert.Equal(t, err, nil)
assert.Equal(t, data, int64(100*1024*1024))
data, err = ParseDataStorage("100Mb")
assert.Equal(t, data, int64(100*1024*1024))
assert.Equal(t, err, nil)
data, err = ParseDataStorage("100 MB")
assert.Equal(t, err, nil)
assert.Equal(t, data, int64(100*1024*1024))
data, err = ParseDataStorage("100 mB")
assert.Equal(t, err, nil)
assert.Equal(t, data, int64(100*1024*1024))
data, err = ParseDataStorage("100 Mb")
assert.Equal(t, err, nil)
assert.Equal(t, data, int64(100*1024*1024))
data, err = ParseDataStorage("Mb")
assert.NotEqual(t, err, nil)
data, err = ParseDataStorage("")
assert.NotEqual(t, err, nil)
data, err = ParseDataStorage("100")
assert.NotEqual(t, err, nil)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment