Просто интересно, предоставляет ли .NET чистый способ сделать это:
int64 x = 1000000;
string y = null;
if (x / 1024 == 0) {
y = x + " bytes";
}
else if (x / (1024 * 1024) == 0) {
y = string.Format("{0:n1} KB", x / 1024f);
}
и т.д...
Вот довольно краткий способ сделать это:
static readonly string[] SizeSuffixes =
{ "bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB" };
static string SizeSuffix(Int64 value, int decimalPlaces = 1)
{
if (decimalPlaces < 0) { throw new ArgumentOutOfRangeException("decimalPlaces"); }
if (value < 0) { return "-" + SizeSuffix(-value); }
if (value == 0) { return string.Format("{0:n" + decimalPlaces + "} bytes", 0); }
// mag is 0 for bytes, 1 for KB, 2, for MB, etc.
int mag = (int)Math.Log(value, 1024);
// 1L << (mag * 10) == 2 ^ (10 * mag)
// [i.e. the number of bytes in the unit corresponding to mag]
decimal adjustedSize = (decimal)value / (1L << (mag * 10));
// make adjustment when the value is large enough that
// it would round up to 1000 or more
if (Math.Round(adjustedSize, decimalPlaces) >= 1000)
{
mag += 1;
adjustedSize /= 1024;
}
return string.Format("{0:n" + decimalPlaces + "} {1}",
adjustedSize,
SizeSuffixes[mag]);
}
И вот исходная реализация, которую я предложил, которая может быть немного медленнее, но немного легче следовать:
static readonly string[] SizeSuffixes =
{ "bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB" };
static string SizeSuffix(Int64 value, int decimalPlaces = 1)
{
if (value < 0) { return "-" + SizeSuffix(-value); }
int i = 0;
decimal dValue = (decimal)value;
while (Math.Round(dValue, decimalPlaces) >= 1000)
{
dValue /= 1024;
i++;
}
return string.Format("{0:n" + decimalPlaces + "} {1}", dValue, SizeSuffixes[i]);
}
Console.WriteLine(SizeSuffix(100005000L));
Следует иметь в виду одну вещь: в системе СИ, «килограмм» обычно использует строчную букву k, в то время как все более крупные единицы используют заглавную букву. Windows использует КБ, МБ, ГБ, поэтому я использовал КБ выше, но вместо этого вы можете рассмотреть КБ.
if (value == 0) { return "0"; }
проверку.Оформить заказ в библиотеке ByteSize . Это
System.TimeSpan
для байтов!Он выполняет преобразование и форматирование за вас.
Он также выполняет строковое представление и синтаксический анализ.
источник
Поскольку все остальные публикуют свои методы, я решил опубликовать метод расширения, который обычно использую для этого:
EDIT: добавлены варианты int / long ... и исправлена опечатка copypasta ...
источник
Я хотел бы решить с помощью
Extension methods
,Math.Pow
функции иEnums
:и используйте его как:
источник
В краткой версии ответа, получившего наибольшее количество голосов, есть проблемы со значениями TB.
Я настроил его соответствующим образом, чтобы обрабатывать также значения tb, но без цикла, а также добавил небольшую проверку ошибок для отрицательных значений. Вот мое решение:
источник
Нет. В основном потому, что это довольно узкоспециализированная потребность, и существует слишком много возможных вариантов. (Это «КБ», «КБ» или «Ко»? Мегабайт 1024 * 1024 байта или 1024 * 1000 байтов? - да, в некоторых местах это используется!)
источник
Это вариант, который легче расширить, чем ваш, но нет, в самой библиотеке его нет.
источник
Это один из способов сделать это (номер 1073741824.0 от 1024 * 1024 * 1024, также известный как ГБ)
источник
@ Servy ответил красиво и лаконично. Думаю, может быть еще проще?
источник
На основе элегантного решения NeverHopeless:
Может быть, есть лишние комментарии, но я стараюсь их оставлять, чтобы не повторять те же ошибки во время будущих визитов ...
источник
Нет.
Но вы можете реализовать это так:
Также проверьте Как правильно преобразовать размер файла в байтах в мегабайты или гигабайты?
источник
Я объединил здесь некоторые ответы в два метода, которые отлично работают. Второй метод ниже преобразует строку байтов (например, 1,5,1 ГБ) обратно в байты (например, 1621350140) как значение типа long. Я надеюсь, что это будет полезно для других, которые ищут решение для преобразования байтов в строку и обратно в байты.
источник
float.Parse
дляdouble
?Я знаю, что это уже старая ветка. но может кто поищет решение. А вот что я использую и самый простой способ
источник
Как насчет:
Например, позвоните как
Результатом будет вывод
источник
Я выбрал решение JerKimballs, и мне понравилось. Тем не менее, я хотел бы добавить / отметить, что это действительно предмет споров в целом. В своем исследовании (по другим причинам) я получил следующую информацию.
Когда нормальные люди (я слышал, что они существуют) говорят о гигабайтах, они имеют в виду метрическую систему, в которой 1000 в степени 3 от исходного количества байтов == количеству гигабайт. Однако, конечно, есть стандарты IEC / JEDEC, которые красиво обобщены в википедии, где вместо 1000 в степени x они имеют 1024. Что для физических устройств хранения (и я думаю, что логично, например, Amazon и других) означает постоянно увеличивающаяся разница между метрикой и IEC. Так, например, 1 ТБ == 1 терабайт равен 1000 в степени 4, но IEC официально называет это число как 1 ТиБ, тебибайт как 1024 в степени 4. Но, увы, в нетехнических приложениях (я бы по аудитории) норма - метрика, и в моем собственном приложении для внутреннего использования сейчас я объясняю разницу в документации. Но для демонстрации я даже не предлагаю ничего, кроме метрики. Внутренне, хотя это не имеет отношения к моему приложению, я храню только байты и выполняю вычисления для отображения.
В качестве примечания я нахожу несколько тусклым, что .Net framework AFAIK (и я часто ошибаюсь, благодарю власть имущих) даже в его воплощении 4.5 не содержит ничего об этом ни в каких библиотеках внутри. Можно было бы ожидать, что некоторая библиотека с открытым исходным кодом в какой-то момент станет NuGettable, но я признаю, что это небольшая досада. С другой стороны, System.IO.DriveInfo и другие также имеют только байты (до тех пор, пока), что довольно ясно.
источник
источник
Как насчет рекурсии:
Тогда вы можете назвать это:
источник
Как написано выше, рекурсия - излюбленный способ с помощью логарифма.
Следующая функция имеет 3 аргумента: ввод, ограничение размера вывода, то есть третий аргумент.
Теперь преобразуем 12 ГБ ОЗУ в несколько единиц:
источник
Я использую это для Windows (двоичные префиксы):
источник
Я включил это (практически без изменений) в UWP DataBinding Converter для своего проекта и подумал, что он также может быть полезен другим.
Код такой:
Чтобы использовать его, добавьте локальный ресурс в свой UserControl или XAML страницы:
Ссылка на него в шаблоне привязки данных или экземпляре привязки данных:
И привет. Волшебство случается.
источник
https://github.com/logary/logary/blob/master/src/Logary/DataModel.fs#L832-L837
(ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я написал этот код, даже код в ссылке!)
источник