diff options
author | Unknown <joe2010xtmf@163.com> | 2014-03-15 12:29:49 -0400 |
---|---|---|
committer | Unknown <joe2010xtmf@163.com> | 2014-03-15 12:29:49 -0400 |
commit | 4224ef142e9b7d7f34ae7f24799d62ea787787c5 (patch) | |
tree | c1afee75787889754548d25005d28569b943f3da /modules/base/tool.go | |
parent | 3d032dfb5a287f333f78748546f9737f20edeb50 (diff) | |
download | gitea-4224ef142e9b7d7f34ae7f24799d62ea787787c5.tar.gz gitea-4224ef142e9b7d7f34ae7f24799d62ea787787c5.zip |
Add template func FileSize
Diffstat (limited to 'modules/base/tool.go')
-rw-r--r-- | modules/base/tool.go | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/modules/base/tool.go b/modules/base/tool.go index 4802c413ed..8576b941cc 100644 --- a/modules/base/tool.go +++ b/modules/base/tool.go @@ -8,6 +8,7 @@ import ( "crypto/md5" "encoding/hex" "fmt" + "math" "strings" "time" ) @@ -80,6 +81,51 @@ func TimeSince(then time.Time) string { return then.String() } +const ( + Byte = 1 + KByte = Byte * 1024 + MByte = KByte * 1024 + GByte = MByte * 1024 + TByte = GByte * 1024 + PByte = TByte * 1024 + EByte = PByte * 1024 +) + +var bytesSizeTable = map[string]uint64{ + "b": Byte, + "kb": KByte, + "mb": MByte, + "gb": GByte, + "tb": TByte, + "pb": PByte, + "eb": EByte, +} + +func logn(n, b float64) float64 { + return math.Log(n) / math.Log(b) +} + +func humanateBytes(s uint64, base float64, sizes []string) string { + if s < 10 { + return fmt.Sprintf("%dB", s) + } + e := math.Floor(logn(float64(s), base)) + suffix := sizes[int(e)] + val := float64(s) / math.Pow(base, math.Floor(e)) + f := "%.0f" + if val < 10 { + f = "%.1f" + } + + return fmt.Sprintf(f+"%s", val, suffix) +} + +// FileSize calculates the file size and generate user-friendly string. +func FileSize(s uint64) string { + sizes := []string{"B", "KB", "MB", "GB", "TB", "PB", "EB"} + return humanateBytes(uint64(s), 1024, sizes) +} + // Subtract deals with subtraction of all types of number. func Subtract(left interface{}, right interface{}) interface{} { var rleft, rright int64 |