tonari note

オンラインゲームエンジニアの雑記

string.Format のお話

オブジェクトを置換しながら文字列にしてくれるメソッドのお話。
Console.WriteLineメソッドと相性がいいのでよく使っています。
String.Format メソッド(MSDN)

using System;
 
public class Test
{
        public static void Main()
        {
                // intを3ケタで表示
                Console.WriteLine(string.Format("{0:000}", 1));
        }
}

実行結果

using System;
 
public class Test
{
        public static void Main()
        {
                // 125を16進数で表示
                Console.WriteLine(string.Format("{0:X}", 125));
        }
}

実行結果

どの型にどのフォーマットが使用可能かはこちらにまとめられています。
型の書式設定(MSDN)

また、このフォーマット形式に当てはまるクラスや構造体を、IFormattableインターフェイスを用いて自分で実装することができます。
IFormattable インターフェイス(MSDN)

using System;
 
public class Test
{
        public static void Main()
        {
                var hp = new HP(34, 58);
 
                Console.WriteLine(string.Format("{0}", hp));
                Console.WriteLine(string.Format("{0:P}", hp));
        }
}
 
class HP : IFormattable
{
    private int _maxHp;
    private int _hp;
 
    public HP (int hp, int maxHp)
    {
        _hp = hp;
        _maxHp = maxHp;
    }
 
    public override String ToString() { return ToString(null, null); }
 
    public string ToString(string format, IFormatProvider fp)
    {
        if (format == null) 
        {
            return string.Format("{0}/{1}", _hp, _maxHp);
        }
 
        if (format == "P") 
        {
            return string.Format("{0:P}", (float)_hp / (float)_maxHp);
        }
 
        throw new FormatException(string.Format("Invalid format string: '{0}'.", format));
    }
}

実行結果

【追記】
@neueccさん、@Grabacr07さんよりご指摘いただきました。
ありがとうございます。

Console.WriteLineと合わせる場合は以下のように簡略にかけるそうです。
ただし、string.Formatが単純に略されているわけではなく、Console.WriteLineに複合書式設定ができるメソッドのオーバーロードが用意されています。

using System;
 
public class Test
{
        public static void Main()
        {
                Console.WriteLine("{0:000}", 1);
        }
}

実行結果

素敵。