代码之家  ›  专栏  ›  技术社区  ›  Peter

以用户友好的格式显示带宽速度

  •  2
  • Peter  · 技术社区  · 14 年前

    我正在寻找一个字符串转换方法,它将接收kb/s的输入,并将其转换为最容易阅读的格式。

    例如,1500 b/s=1.46 kb/s
    例如,1500 kb/s=1.46 mb/s
    例如,1500 MB/s=1.46 GB/s

    谢谢

    2 回复  |  直到 14 年前
        1
  •  6
  •   KeithS    14 年前

    试试这个:

    var ordinals = new [] {"","K","M","G","T","P","E"};
    
    long bandwidth = GetTheBandwidthInBitsPerSec();
    
    decimal rate = (decimal)bandwidth;
    
    var ordinal = 0;
    
    while(rate > 1024)
    {
       rate /= 1024;
       ordinal++;
    }
    
    output.Write(String.Format("Bandwidth: {0} {1}b/s", 
       Math.Round(rate, 2, MidpointRounding.AwayFromZero), 
       ordinals[ordinal]));
    

    这里提供的序数(前缀)是kilo-、mega-、giga-、tera-、peta-、exa-。如果你真的认为你的程序足够长,可以看到zettabit和yottabit网络带宽,那么一定要把z和y前缀的首字母放到数组中。

    要从一个格式化字符串转换为另一个,请在空格上拆分,查看将成为数字的术语,然后在紧接其后的术语中搜索其中一个前缀。在数组中查找序数的索引,加1,然后乘以1024,得到每秒位数:

    var bwString= GetBandwidthAsFormattedString(); //returns "Bandwidth: 1056 Kb/s";
    
    var parts = String.Split(bwString, " ");
    var number = decimal.Parse(parts[1]);
    var ordinalChar = parts[2].First().ToString();
    ordinalChar = ordinalChar = "b" ? "" : ordinalChar;
    
    var ordinal = ordinals.IndexOf(ordinalChar)
    
    ... //previous code, substituting the definition of ordinal
    
        2
  •  1
  •   Wildhorn    14 年前

    我在大约30秒钟内编写了这段代码,因此没有验证,但我认为它可以满足您的需要。

            string vInput = "1500 Kb/s";
            string[] tSize = new string[] { "b/s", "Kb/s", "Mb/s", "Gb/s" };
            string[] tSplit = vInput.Split(new string[] {" "}, StringSplitOptions.RemoveEmptyEntries);
            double vSpeed = Double.Parse(tSplit[0]) / 1024.0;
            vSpeed = Math.Round(vSpeed, 2);
            int i = 0;
            for(i = 0; i < tSize.Length;++i)
            {
                if(tSplit[1].StartsWith(tSize[i]))
                {
                    break;
                }
            }
            string vOutput = vSpeed.ToString() + " " + tSize[i+1];