mirror of
https://github.com/opencloud-eu/opencloud.git
synced 2026-05-03 05:33:30 -04:00
The goutil that OpenCloud currently uses is one version from the release that adds FreeBSD support, this now compiles successfully on FreeBSD.
88 lines
1.9 KiB
Go
88 lines
1.9 KiB
Go
package mathutil
|
|
|
|
import "fmt"
|
|
|
|
// DataSize format bytes number friendly. eg: 1024 => 1KB, 1024*1024 => 1MB
|
|
//
|
|
// Usage:
|
|
//
|
|
// file, err := os.Open(path)
|
|
// fl, err := file.Stat()
|
|
// fmtSize := DataSize(fl.Size())
|
|
func DataSize(size uint64) string {
|
|
switch {
|
|
case size < 1024:
|
|
return fmt.Sprintf("%dB", size)
|
|
case size < 1024*1024:
|
|
return fmt.Sprintf("%.2fK", float64(size)/1024)
|
|
case size < 1024*1024*1024:
|
|
return fmt.Sprintf("%.2fM", float64(size)/1024/1024)
|
|
default:
|
|
return fmt.Sprintf("%.2fG", float64(size)/1024/1024/1024)
|
|
}
|
|
}
|
|
|
|
// FormatBytes Format the byte size to be a readable string. eg: 1024 => 1 KB
|
|
func FormatBytes(bytes int) string {
|
|
const unit = 1024
|
|
if bytes < unit {
|
|
return fmt.Sprintf("%d B", bytes)
|
|
}
|
|
|
|
div, exp := int64(unit), 0
|
|
for n := bytes / unit; n >= unit; n /= unit {
|
|
div *= unit
|
|
exp++
|
|
}
|
|
return fmt.Sprintf("%.2f %cB", float64(bytes)/float64(div), "KMGTPE"[exp])
|
|
}
|
|
|
|
var timeFormats = [][]int{
|
|
{0},
|
|
{1},
|
|
{2, 1},
|
|
{60},
|
|
{120, 60},
|
|
{3600},
|
|
{7200, 3600},
|
|
{86400},
|
|
{172800, 86400}, // second elem is unit.
|
|
{2592000},
|
|
{2592000 * 2, 2592000},
|
|
}
|
|
|
|
var timeMessages = []string{
|
|
"< 1 sec", "1 sec", "secs", "1 min", "mins", "1 hr", "hrs", "1 day", "days", "1 month", "months",
|
|
}
|
|
|
|
// HowLongAgo format a seconds, get how lang ago. eg: 1 day, 1 week
|
|
func HowLongAgo(sec int64) string {
|
|
intVal := int(sec)
|
|
length := len(timeFormats)
|
|
|
|
for i, item := range timeFormats {
|
|
if intVal >= item[0] {
|
|
ni := i + 1
|
|
match := false
|
|
|
|
if ni < length { // next exists
|
|
next := timeFormats[ni]
|
|
if intVal < next[0] { // current <= intVal < next
|
|
match = true
|
|
}
|
|
} else if ni == length { // current is last
|
|
match = true
|
|
}
|
|
|
|
if match { // match success
|
|
if len(item) == 1 {
|
|
return timeMessages[i]
|
|
}
|
|
return fmt.Sprintf("%d %s", intVal/item[1], timeMessages[i])
|
|
}
|
|
}
|
|
}
|
|
|
|
return "unknown" // He should never happen
|
|
}
|