aboutsummaryrefslogtreecommitdiffstats
path: root/modules/base/tool.go
diff options
context:
space:
mode:
authorUnknown <joe2010xtmf@163.com>2014-03-15 12:29:49 -0400
committerUnknown <joe2010xtmf@163.com>2014-03-15 12:29:49 -0400
commit4224ef142e9b7d7f34ae7f24799d62ea787787c5 (patch)
treec1afee75787889754548d25005d28569b943f3da /modules/base/tool.go
parent3d032dfb5a287f333f78748546f9737f20edeb50 (diff)
downloadgitea-4224ef142e9b7d7f34ae7f24799d62ea787787c5.tar.gz
gitea-4224ef142e9b7d7f34ae7f24799d62ea787787c5.zip
Add template func FileSize
Diffstat (limited to 'modules/base/tool.go')
-rw-r--r--modules/base/tool.go46
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