code.cloudfoundry.org/cli@v7.1.0+incompatible/cf/formatters/bytes.go (about) 1 package formatters 2 3 import ( 4 "errors" 5 "fmt" 6 "regexp" 7 "strconv" 8 "strings" 9 10 . "code.cloudfoundry.org/cli/cf/i18n" 11 ) 12 13 const ( 14 BYTE = 1.0 15 KILOBYTE = 1024 * BYTE 16 MEGABYTE = 1024 * KILOBYTE 17 GIGABYTE = 1024 * MEGABYTE 18 TERABYTE = 1024 * GIGABYTE 19 ) 20 21 func ByteSize(bytes int64) string { 22 unit := "" 23 value := float32(bytes) 24 25 switch { 26 case bytes >= TERABYTE: 27 unit = "T" 28 value = value / TERABYTE 29 case bytes >= GIGABYTE: 30 unit = "G" 31 value = value / GIGABYTE 32 case bytes >= MEGABYTE: 33 unit = "M" 34 value = value / MEGABYTE 35 case bytes >= KILOBYTE: 36 unit = "K" 37 value = value / KILOBYTE 38 case bytes == 0: 39 return "0" 40 case bytes < KILOBYTE: 41 unit = "B" 42 } 43 44 stringValue := fmt.Sprintf("%.1f", value) 45 stringValue = strings.TrimSuffix(stringValue, ".0") 46 return fmt.Sprintf("%s%s", stringValue, unit) 47 } 48 49 func ToMegabytes(s string) (int64, error) { 50 parts := bytesPattern.FindStringSubmatch(strings.TrimSpace(s)) 51 if len(parts) < 3 { 52 return 0, invalidByteQuantityError() 53 } 54 55 value, err := strconv.ParseInt(parts[1], 10, 0) 56 if err != nil { 57 return 0, invalidByteQuantityError() 58 } 59 60 var bytes int64 61 unit := strings.ToUpper(parts[2]) 62 switch unit { 63 case "T": 64 bytes = value * TERABYTE 65 case "G": 66 bytes = value * GIGABYTE 67 case "M": 68 bytes = value * MEGABYTE 69 case "K": 70 bytes = value * KILOBYTE 71 } 72 73 return bytes / MEGABYTE, nil 74 } 75 76 var ( 77 bytesPattern = regexp.MustCompile(`(?i)^(-?\d+)([KMGT])B?$`) 78 ) 79 80 func invalidByteQuantityError() error { 81 return errors.New(T("Byte quantity must be an integer with a unit of measurement like M, MB, G, or GB")) 82 }