TGWS>プログラミング>

ファイルサイズを文字列に変換するFormatProvider

ファイルサイズを手っ取り早く文字列化したい場合があります。
そんな関数を作るのはそう難しいことではありませんが、string.Formatメソッドでも使えたらうれしいなって、思ったりしません?
そういうときに使えるのがICustomFormatterとIFormatProviderです。
こんな風に使います。

using System;

class FilesizeFormat : ICustomFormatter, IFormatProvider
{
    public object GetFormat(Type formatType)
    {
        return this;
    }

    public string Format(string format, object arg, IFormatProvider formatProvider)
    {
        double size = 0;
        if (arg is string)
        {
            size = double.Parse((string)arg);
        }
        else
        {
            size = (double)arg;
        }
        if (size < 1024) return string.Format("{0}B", size);
        size = Math.Floor(size / 1024);
        if (size < 1024) return string.Format("{0}KB", size);
        size = Math.Floor(size / 1024);
        if (size < 1024) return string.Format("{0}MB", size);
        size = Math.Floor(size / 1024);
        if (size < 1024) return string.Format("{0}GB", size);
        size = Math.Floor(size / 1024);
        if (size < 1024) return string.Format("{0}TB", size);
        size = Math.Floor(size / 1024);
        if (size < 1024) return string.Format("{0}PB", size);
        size = Math.Floor(size / 1024);
        if (size < 1024) return string.Format("{0}EB", size);
        size = Math.Floor(size / 1024);
        if (size < 1024) return string.Format("{0}ZB", size);
        size = Math.Floor(size / 1024);
        return string.Format("{0}YB", size);
    }
}
// 使用例
class Program
{
    static void Main(string[] args)
    {
        FilesizeFormat f = new FilesizeFormat();
        double size = 1000;
        Console.Out.WriteLine(string.Format(f, "{0}", size));
        size *= 1000;
        Console.Out.WriteLine(string.Format(f, "{0}", size));
        size *= 1000;
        Console.Out.WriteLine(string.Format(f, "{0}", size));
        size *= 1000;
        Console.Out.WriteLine(string.Format(f, "{0}", size));
        size *= 1000;
        Console.Out.WriteLine(string.Format(f, "{0}", size));
        size *= 1000;
        Console.Out.WriteLine(string.Format(f, "{0}", size));
        size *= 1000;
        Console.Out.WriteLine(string.Format(f, "{0}", size));
        size *= 1000;
        Console.Out.WriteLine(string.Format(f, "{0}", size));
        size *= 1000;
        Console.Out.WriteLine(string.Format(f, "{0}", size));
        size *= 1000;
        Console.Out.WriteLine(string.Format(f, "{0}", size));
    }
}

今回は来た値を片っ端からファイルサイズっぽい表現に変換しているのでそのままでは使いにくいですが、ファイルサイズでなかったら本来のFormatを適用するようにすればそこそこ使えるようになるでしょう。