C#实践:将字节单位表示的数据换算成其他常见的单位


最近无聊试着补一下之前的坑,发现编程中有很多地方需要容量单位的换算,很多方法返回的大小数据都是以字节为单位的,需要换算成其他更直观的单位。

我最初想到的思路,在百度最先找到的方法,是下面的一种

public static String FormatFileSize(Int64 fileSize)
{
    if (fileSize < 0)
    {
        throw new ArgumentOutOfRangeException("fileSize");
    }
    else if (fileSize >= 1024 * 1024 * 1024)
    {
        return string.Format("{0:########0.00} GB", ((Double)fileSize) / (1024 * 1024 * 1024));
    }
    else if (fileSize >= 1024 * 1024)
    {
        return string.Format("{0:####0.00} MB", ((Double)fileSize) / (1024 * 1024));
    }
    else if (fileSize >= 1024)
    {
        return string.Format("{0:####0.00} KB", ((Double)fileSize) / 1024);
    }
    else
    {
        return string.Format("{0} bytes", fileSize);
    }
}

之后继续在google上面找了一下,发现一段非常让我吃惊的代码,这段代码中使用的方法非常巧妙,我不知道作者对容量单位换算是有多了解多深入才能敲出这样的一段代码,虽然能够勉强看得懂,但原理基本不明,跟上面那段代码相比代码量少的不是一点点。

        public static string humanReadableByteCount(long bytes)
        {
            int unit = 1024;
            if (bytes < unit) return bytes + " B";
            int exp = (int)(Math.Log(bytes) / Math.Log(unit));
            return String.Format("{0:F1} {1}B", bytes / Math.Pow(unit, exp), "KMGTPE"[exp - 1]);
        }

这段代码原本是用Java写的,很简单就能改成C#!代码的巧妙之处在于没有使用任何循环判断,就一个if,之后全是运算,效率非常高。我觉得这个完全有必要收藏起来方便以后使用。附上原来的代码

public static String humanReadableByteCount(long bytes, boolean si) {
    int unit = si ? 1000 : 1024;
    if (bytes < unit) return bytes + " B";
    int exp = (int) (Math.log(bytes) / Math.log(unit));
    String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp-1) + (si ? "" : "i");
    return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre);
}

测试代码:

            long[] longs = { 0, 27, 999, 1000, 1023, 1024, 1728, 110592, 7077888, 452984832, 28991029248, 1855425871872, long.MaxValue };

            foreach (var l in longs)

                Console.WriteLine("{0,-20} {1,-10} {2,-10}", l, humanReadableByteCount(l, true), humanReadableByteCount(l, false));

测试结果:



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

110592               110.6 kB   108.0 KiB

7077888              7.1 MB     6.8 MiB

452984832            453.0 MB   432.0 MiB

28991029248          29.0 GB    27.0 GiB

1855425871872        1.9 TB     1.7 TiB

9223372036854775807  9.2 EB     8.0 EiB
,

有 5 条《C#实践:将字节单位表示的数据换算成其他常见的单位》的回复

  1. 这个算是一条公式运算= =。。。

发表评论

8 + 0 = ?