mirror of https://github.com/docker/docs.git
				
				
				
			
		
			
				
	
	
		
			93 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
| package units
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"regexp"
 | |
| 	"strconv"
 | |
| 	"strings"
 | |
| )
 | |
| 
 | |
| // HumanSize returns a human-readable approximation of a size
 | |
| // using SI standard (eg. "44kB", "17MB")
 | |
| func HumanSize(size int64) string {
 | |
| 	i := 0
 | |
| 	var sizef float64
 | |
| 	sizef = float64(size)
 | |
| 	units := []string{"B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"}
 | |
| 	for sizef >= 1000.0 {
 | |
| 		sizef = sizef / 1000.0
 | |
| 		i++
 | |
| 	}
 | |
| 	return fmt.Sprintf("%.4g %s", sizef, units[i])
 | |
| }
 | |
| 
 | |
| // FromHumanSize returns an integer from a human-readable specification of a size
 | |
| // using SI standard (eg. "44kB", "17MB")
 | |
| func FromHumanSize(size string) (int64, error) {
 | |
| 	re, error := regexp.Compile("^(\\d+)([kKmMgGtTpP])?[bB]?$")
 | |
| 	if error != nil {
 | |
| 		return -1, fmt.Errorf("%s does not specify not a size", size)
 | |
| 	}
 | |
| 
 | |
| 	matches := re.FindStringSubmatch(size)
 | |
| 
 | |
| 	if len(matches) != 3 {
 | |
| 		return -1, fmt.Errorf("Invalid size: '%s'", size)
 | |
| 	}
 | |
| 
 | |
| 	theSize, error := strconv.ParseInt(matches[1], 10, 0)
 | |
| 	if error != nil {
 | |
| 		return -1, error
 | |
| 	}
 | |
| 
 | |
| 	unit := strings.ToLower(matches[2])
 | |
| 
 | |
| 	if unit == "k" {
 | |
| 		theSize *= 1000
 | |
| 	} else if unit == "m" {
 | |
| 		theSize *= 1000 * 1000
 | |
| 	} else if unit == "g" {
 | |
| 		theSize *= 1000 * 1000 * 1000
 | |
| 	} else if unit == "t" {
 | |
| 		theSize *= 1000 * 1000 * 1000 * 1000
 | |
| 	} else if unit == "p" {
 | |
| 		theSize *= 1000 * 1000 * 1000 * 1000 * 1000
 | |
| 	}
 | |
| 
 | |
| 	return theSize, nil
 | |
| }
 | |
| 
 | |
| // Parses a human-readable string representing an amount of RAM
 | |
| // in bytes, kibibytes, mebibytes or gibibytes, and returns the
 | |
| // number of bytes, or -1 if the string is unparseable.
 | |
| // Units are case-insensitive, and the 'b' suffix is optional.
 | |
| func RAMInBytes(size string) (bytes int64, err error) {
 | |
| 	re, error := regexp.Compile("^(\\d+)([kKmMgG])?[bB]?$")
 | |
| 	if error != nil {
 | |
| 		return -1, error
 | |
| 	}
 | |
| 
 | |
| 	matches := re.FindStringSubmatch(size)
 | |
| 
 | |
| 	if len(matches) != 3 {
 | |
| 		return -1, fmt.Errorf("Invalid size: '%s'", size)
 | |
| 	}
 | |
| 
 | |
| 	memLimit, error := strconv.ParseInt(matches[1], 10, 0)
 | |
| 	if error != nil {
 | |
| 		return -1, error
 | |
| 	}
 | |
| 
 | |
| 	unit := strings.ToLower(matches[2])
 | |
| 
 | |
| 	if unit == "k" {
 | |
| 		memLimit *= 1024
 | |
| 	} else if unit == "m" {
 | |
| 		memLimit *= 1024 * 1024
 | |
| 	} else if unit == "g" {
 | |
| 		memLimit *= 1024 * 1024 * 1024
 | |
| 	}
 | |
| 
 | |
| 	return memLimit, nil
 | |
| }
 |