Um aus Byte-Angaben (z.B. von Dateigrößen) menschenlesbare Werte (z.B. „12.5GB“) zu machen, sowie den anderen Weg, habe ich mir ein bisschen Code geschrieben bzw. von Stack Overflow zusammen gesucht:
public static class SizeTranslationHelper
{
/// <summary>
/// Converts bytes to human-readable, e.g. "12.5GB".
/// </summary>
public static string MakeLazy(ulong byteCount)
{
string[] suf = { @"B", @"KB", @"MB", @"GB", @"TB", @"PB", @"EB" }; //Longs run out around EB
if (byteCount == 0)
return "0" + suf[0];
var bytes = (ulong)Math.Abs((decimal)byteCount);
var place = Convert.ToInt32(Math.Floor(Math.Log(bytes, 1024ul)));
var num = Math.Round(bytes / Math.Pow(1024ul, place), 1);
return (Math.Sign((decimal)byteCount) * num).ToString(CultureInfo.InvariantCulture) + suf[place];
}
/// <summary>
/// Converts human-readable, e.g. "12.5GB", to bytes.
/// </summary>
public static ulong TranslateLazySize(string sizeLazy)
{
sizeLazy = sizeLazy.ToLowerInvariant();
ulong result = 0;
if (tryParse(ref result, sizeLazy, @"b", 1ul))
{
return result;
}
else if (tryParse(ref result, sizeLazy, @"kb", 1024ul))
{
return result;
}
else if (tryParse(ref result, sizeLazy, @"mb", 1024ul * 1024ul))
{
return result;
}
else if (tryParse(ref result, sizeLazy, @"gb", 1024ul * 1024ul * 1024ul))
{
return result;
}
else if (tryParse(ref result, sizeLazy, @"tb", 1024ul * 1024ul * 1024ul * 1024ul))
{
return result;
}
else if (tryParse(ref result, sizeLazy, @"pb", 1024ul * 1024ul * 1024ul * 1024ul * 1024ul))
{
return result;
}
else if (tryParse(ref result, sizeLazy, @"eb", 1024ul * 1024ul * 1024ul * 1024ul * 1024ul * 1024ul))
{
return result;
}
else
{
decimal r;
if (decimal.TryParse(sizeLazy, NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out r))
{
return (ulong)r;
}
else
{
throw new Exception(string.Format(@"Cannot parse '{0}' to number.", sizeLazy));
}
}
}
private static bool tryParse(ref ulong result, string sizeLazy, string suffix, ulong factor)
{
decimal r;
if (
sizeLazy.EndsWith(suffix) &&
decimal.TryParse(sizeLazy.Substring(0, sizeLazy.Length - suffix.Length), NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out r))
{
result = (ulong)(r * factor);
return true;
}
else
{
return false;
}
}
}