Home | History | Annotate | Download | only in progs
      1 // Copyright 2009 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 package main
      6 
      7 import "fmt"
      8 
      9 type ByteSize float64
     10 
     11 const (
     12 	_           = iota // ignore first value by assigning to blank identifier
     13 	KB ByteSize = 1 << (10 * iota)
     14 	MB
     15 	GB
     16 	TB
     17 	PB
     18 	EB
     19 	ZB
     20 	YB
     21 )
     22 
     23 func (b ByteSize) String() string {
     24 	switch {
     25 	case b >= YB:
     26 		return fmt.Sprintf("%.2fYB", b/YB)
     27 	case b >= ZB:
     28 		return fmt.Sprintf("%.2fZB", b/ZB)
     29 	case b >= EB:
     30 		return fmt.Sprintf("%.2fEB", b/EB)
     31 	case b >= PB:
     32 		return fmt.Sprintf("%.2fPB", b/PB)
     33 	case b >= TB:
     34 		return fmt.Sprintf("%.2fTB", b/TB)
     35 	case b >= GB:
     36 		return fmt.Sprintf("%.2fGB", b/GB)
     37 	case b >= MB:
     38 		return fmt.Sprintf("%.2fMB", b/MB)
     39 	case b >= KB:
     40 		return fmt.Sprintf("%.2fKB", b/KB)
     41 	}
     42 	return fmt.Sprintf("%.2fB", b)
     43 }
     44 
     45 func main() {
     46 	fmt.Println(YB, ByteSize(1e13))
     47 }
     48