Go语言:字节数转换为人类可读字符串(human readable)

Here’s how to convert 1000 to "1 kB"1000000 to "1 MB" etc.

func ByteCountDecimal(b int64) string {
        const unit = 1000
        if b < unit {
                return fmt.Sprintf("%d B", b)
        }
        div, exp := int64(unit), 0
        for n := b / unit; n >= unit; n /= unit {
                div *= unit
                exp++
        }
        return fmt.Sprintf("%.1f %cB", float64(b)/float64(div), "kMGTPE"[exp])
}

func ByteCountBinary(b int64) string {
        const unit = 1024
        if b < unit {
                return fmt.Sprintf("%d B", b)
        }
        div, exp := int64(unit), 0
        for n := b / unit; n >= unit; n /= unit {
                div *= unit
                exp++
        }
        return fmt.Sprintf("%.1f %ciB", float64(b)/float64(div), "KMGTPE"[exp])
}

Example input/output:

           Input     Decimal (SI)     Binary (IEC)
               0            "0 B"            "0 B"
              27           "27 B"           "27 B"
             999          "999 B"          "999 B"
            1000         "1.0 kB"         "1000 B"
            1023         "1.0 kB"         "1023 B"
            1024         "1.0 kB"        "1.0 KiB"
            1728         "1.7 kB"        "1.7 KiB"
   1855425871872         "1.9 TB"        "1.7 TiB"
   math.MaxInt64         "9.2 EB"        "8.0 EiB

猜你喜欢

转载自blog.csdn.net/pengpengzhou/article/details/111691835