Отображение скорости передачи в удобном для пользователя формате - PullRequest
2 голосов
/ 17 сентября 2010

Я ищу метод преобразования строк, который получит входные данные в КБ / с и преобразует его в наиболее удобный для чтения формат.

например, 1500 б / с = 1,46 КБ / с
например, 1500 Кбит / с = 1,46 Мбит / с
Например, 1500 Мбит / с = 1,46 Гбит / с

Спасибо

Ответы [ 2 ]

6 голосов
/ 17 сентября 2010

Попробуйте это:

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]));

Доступные здесь порядковые номера (префиксы): Кило, Мега, Гига, Тера, Пета, Экс. Если вы действительно думаете, что ваша программа будет достаточно длинной, чтобы увидеть пропускную способность сети 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
1 голос
/ 17 сентября 2010

Я сделал этот код примерно за 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];
...