| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 | package bytesimport (	"fmt"	"regexp"	"strconv")type (	// Bytes struct	Bytes struct{})const (	_ = 1.0 << (10 * iota) // ignore first value by assigning to blank identifier	KB	MB	GB	TB	PB	EB)var (	pattern = regexp.MustCompile(`(?i)^(-?\d+(?:\.\d+)?)([KMGTPE]B?|B?)$`)	global  = New())// New creates a Bytes instance.func New() *Bytes {	return &Bytes{}}// Format formats bytes integer to human readable string.// For example, 31323 bytes will return 30.59KB.func (*Bytes) Format(b int64) string {	multiple := ""	value := float64(b)	switch {	case b >= EB:		value /= EB		multiple = "EB"	case b >= PB:		value /= PB		multiple = "PB"	case b >= TB:		value /= TB		multiple = "TB"	case b >= GB:		value /= GB		multiple = "GB"	case b >= MB:		value /= MB		multiple = "MB"	case b >= KB:		value /= KB		multiple = "KB"	case b == 0:		return "0"	default:		return strconv.FormatInt(b, 10) + "B"	}	return fmt.Sprintf("%.2f%s", value, multiple)}// Parse parses human readable bytes string to bytes integer.// For example, 6GB (6G is also valid) will return 6442450944.func (*Bytes) Parse(value string) (i int64, err error) {	parts := pattern.FindStringSubmatch(value)	if len(parts) < 3 {		return 0, fmt.Errorf("error parsing value=%s", value)	}	bytesString := parts[1]	multiple := parts[2]	bytes, err := strconv.ParseFloat(bytesString, 64)	if err != nil {		return	}	switch multiple {	default:		return int64(bytes), nil	case "K", "KB":		return int64(bytes * KB), nil	case "M", "MB":		return int64(bytes * MB), nil	case "G", "GB":		return int64(bytes * GB), nil	case "T", "TB":		return int64(bytes * TB), nil	case "P", "PB":		return int64(bytes * PB), nil	case "E", "EB":		return int64(bytes * EB), nil	}}// Format wraps global Bytes's Format function.func Format(b int64) string {	return global.Format(b)}// Parse wraps global Bytes's Parse function.func Parse(val string) (int64, error) {	return global.Parse(val)}
 |