mirror of
https://github.com/sphildreth/roadie
synced 2024-11-27 06:30:21 +00:00
95 lines
No EOL
2.5 KiB
C#
95 lines
No EOL
2.5 KiB
C#
using System;
|
|
|
|
namespace Roadie.Library.Utility
|
|
{
|
|
public class FileSizeFormatProvider : IFormatProvider, ICustomFormatter
|
|
{
|
|
private const string fileSizeFormat = "fs";
|
|
|
|
private const Decimal OneGigaByte = OneMegaByte * 1024M;
|
|
|
|
private const Decimal OneKiloByte = 1024M;
|
|
|
|
private const Decimal OneMegaByte = OneKiloByte * 1024M;
|
|
|
|
private const Decimal OneTeraByte = OneGigaByte * 1024M;
|
|
|
|
public string Format(string format, object arg, IFormatProvider formatProvider)
|
|
{
|
|
if (format == null || !format.StartsWith(fileSizeFormat))
|
|
{
|
|
return defaultFormat(format, arg, formatProvider);
|
|
}
|
|
|
|
if (arg is string)
|
|
{
|
|
return defaultFormat(format, arg, formatProvider);
|
|
}
|
|
|
|
Decimal size;
|
|
|
|
try
|
|
{
|
|
size = Convert.ToDecimal(arg);
|
|
}
|
|
catch (InvalidCastException)
|
|
{
|
|
return defaultFormat(format, arg, formatProvider);
|
|
}
|
|
|
|
string suffix;
|
|
if (size > OneTeraByte)
|
|
{
|
|
size /= OneTeraByte;
|
|
suffix = "TB";
|
|
}
|
|
else if (size > OneGigaByte)
|
|
{
|
|
size /= OneGigaByte;
|
|
suffix = "GB";
|
|
}
|
|
else if (size > OneMegaByte)
|
|
{
|
|
size /= OneMegaByte;
|
|
suffix = "MB";
|
|
}
|
|
else if (size > OneKiloByte)
|
|
{
|
|
size /= OneKiloByte;
|
|
suffix = "kB";
|
|
}
|
|
else
|
|
{
|
|
suffix = " B";
|
|
}
|
|
|
|
string precision = format.Substring(2);
|
|
if (String.IsNullOrEmpty(precision))
|
|
{
|
|
precision = "2";
|
|
}
|
|
|
|
return String.Format("{0:N" + precision + "}{1}", size, suffix);
|
|
}
|
|
|
|
public object GetFormat(Type formatType)
|
|
{
|
|
if (formatType == typeof(ICustomFormatter))
|
|
{
|
|
return this;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
private static string defaultFormat(string format, object arg, IFormatProvider formatProvider)
|
|
{
|
|
IFormattable formattableArg = arg as IFormattable;
|
|
if (formattableArg != null)
|
|
{
|
|
return formattableArg.ToString(format, formatProvider);
|
|
}
|
|
return arg.ToString();
|
|
}
|
|
}
|
|
} |