【问题标题】:convert bytes to mb with 0.00 format使用 0.00 格式将字节转换为 mb
【发布时间】:2018-03-29 03:06:46
【问题描述】:

我创建了一个标头数据检索器,用户在其中输入 URL 并返回以 mb 为单位的大小
我的代码工作正常,但它不显示浮动值

if (long.TryParse(resp.Headers.Get("Content-Length"), out ContentLength))
{
    string File_Size;

    if (ContentLength >= 1073741824)
    {
        result = ContentLength / 1073741824;

        kbmbgb.Text = "GB";
    }
    else if (ContentLength >= 1048576)
    {
        result = ContentLength / 1048576;

        kbmbgb.Text = "MB";
    }
    else if (ContentLength >= 1024)
    {
        result = ContentLength / 1024;

        kbmbgb.Text = "KB";
    }
    else
    {
        result = ContentLength;
        kbmbgb.Text = "BYTE";

    }

    File_Size = result.ToString("0.00");
    sizevaluelabel.Text = File_Size;
}

【问题讨论】:

  • 可能与 KB 相同,但再次除以 1024。 gbmb.org/megabytes
  • long 是一个长整数,在 C# 中将两个整数相除得到一个整数。
  • 即使我转换成浮动我也无法工作
  • 你的代码可以更短... long size = 1024 * 1024 * 892 + 256 * 1000; var XB = new[] { " Bytes", " KB", " MB", " GB", " TB", " PB" }; var inx = (int)Math.Log(size, 1024); var text = (size / Math.Pow(1024, inx)).ToString("#.00") + XB[inx];

标签: c#


【解决方案1】:

问题是您完全在整数类型中工作,不为十进制存储提供任何空间。您需要转换为双精度或小数。如果您使用的是 C# 7(支持元组),您可以这样做:

public (double, string) AdjustFileSize(long fileSizeInBytes)
{
    var names = {"BYTES", "KB", "MB", "GB"};

    double sizeResult = fileSizeInBytes * 1.0;
    int nameIndex = 0;
    while (sizeResult > 1024 && nameIndex < names.Length)
    {
        sizeResult /= 1024; 
        nameIndex++;
    }

    return (sizeResult, names[nameIndex]);
}

这是另一种有趣的方式:

public (double, string) AdjustFileSize(long fileSizeInBytes)
{
    if (fileSizeInBytes <= 0) return (0.0, "BYTES");

    var names = {"BYTES", "KB", "MB", "GB"};
    var sizes = {1.0, 1024.0, 1048576.0, 1073741824.0};

    var index = Math.Log(fileSizeInBytes, 1024);
    return (fileSizeInBytes / sizes[index], names[index]);
}

然后像这样调用任一版本:

long ContentLength = 0;
if (long.TryParse(resp.Headers.Get("Content-Length"), out ContentLength))
{
    var size = AdjustFileSize(ContentLength);
    sizevaluelabel.Text = size.Item1.ToString("0.00");
    kbmbgb.Text = size.Item2;
}

如果你不能使用元组,我会定义一个小类来传达相同的信息,或者甚至可以定义一个小尺寸的结构。

【讨论】:

  • 好吧,我喜欢 Tuples 的样子
  • 您重新打开问题并回答相同?配音答案已经说明它是一个整数除法
【解决方案2】:

上面的大部分答案对于初学者来说太难理解了,所以经过几次尝试和尝试,我找到了自己的方式。这就是答案。

                double ContentLength = 0;
                double result;
                if (double.TryParse(resp.Headers.Get("Content-Length"), out ContentLength))
                {
                    string File_Size;

                    if (ContentLength >= 1073741824.00)
                    {
                        result = ContentLength / 1073741824.00;
                        kbmbgb.Text = "GB";
                    }
                    else if (ContentLength >= 1048576.00)
                    {
                        result = ContentLength / 1048576.00;
                        kbmbgb.Text = "MB";
                    }
                    else if (ContentLength >= 1024.00)
                    {
                        result = ContentLength / 1024.00;
                        kbmbgb.Text = "KB";
                    }
                    else
                    {
                        result = ContentLength;
                        kbmbgb.Text = "BYTE";

                    }
                    File_Size = result.ToString("0.00");
                    sizevaluelabel.Text = File_Size;

【讨论】:

  • 只要把long改成double
  • “大多数上述答案”中,什么让 ex 难以理解
  • 编码不需要很复杂,它可以很容易,无论如何,他们中的大多数人都试图使用硬方法,但他们都没有寻找代码中的缺陷
  • 参见 Hans Passant 的 评论。什么是难以理解的?什么是难以实施的?您需要做的就是将.0 添加到您的常量中(顺便说一句,您的第二个0 在双打xxx.00 是不必要的)。 Chris 的 评论有何难处?该链接解释了整数除法问题。 蒂姆也这么说
猜你喜欢
  • 1970-01-01
  • 2012-08-02
  • 2020-06-28
  • 2017-10-25
  • 2021-08-09
  • 1970-01-01
  • 2018-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多