пятница, 29 июня 2012 г.

Шпаргалка по string.Format

В MSDN оно конечно все расписано, но с обратной стороны - что означает каждый флаг, а не как сделать чтоб было вот так вот.

Так что нехай будет.

using System;
using System.Globalization;

namespace strfrmt
{
  class Program
  {
    static void Main(string[] args)
    {
      // дата и время
      Console.WriteLine("{0:dd.MM.yyyy HH:mm:ss dddd (ddd) MMMM (MMM)}", DateTime.Now);
      // 28.06.2012 11:40:48 четверг (Чт) Июнь (июн)

      // пользовательское форматирование даты
      Console.WriteLine(string.Format(new HumanDateFormatProvider(), "{0,20:Hdt}", DateTime.Now));
      //    Сегодня 11:40:48
      Console.WriteLine(string.Format(new HumanDateFormatProvider(), "{0,20:Hdt}", DateTime.Now.AddDays(-1)));
      //      Вчера 11:40:48
      Console.WriteLine(string.Format(new HumanDateFormatProvider(), "{0,20:Hdt}", DateTime.Now.AddDays(-2)));
      // 26.06.2012 11:40:48

      // принудительные + и -
      Console.WriteLine("{0:+0.0;-0.0} {1:+000.000;-000.000}", 1.48, -24.0);
      // +1,5 -024,000

      // заданное количество знаков до и после десятичной точки
      Console.WriteLine("'{0:0.}' '{0:000.0}' '{0:F0}' '{0,-9:F3}', '{0,7:F2}'", 80.49);
      // '80' '080,5' '80' '80,490   ', '  80,49'

      // проценты
      Console.WriteLine("'{0:P}' '{0:P0}' '{0:P1}',  '{0,5:P0}', '{0,-5:P0}'", 0.8069);
      // '80,69%' '81%' '80,7%',  '  81%', '81%  '

      // заданное количество знаков
      Console.WriteLine("'{0,5:D}' '{1:D5}' '{2:00000}'", 25, -12, -32);
      // '   25' '-00012' '-00032'

      Console.WriteLine("'{0,-5:D}', '{1,10}' '{1,-10}', 0x{2:X8}", 33, "test1", 123456);
      // '33   ', '     test1' 'test1     ', 0x0001E240

      // форматирование заместителями
      Console.WriteLine("{0:(#) ### ###}, '{1:###:###:###:###:###}', '{2:### ###.##}'", 1234567890, -25, 1235.456);
      // (1234) 567 890, '-::::25', '1 235,46'

      Console.WriteLine("{0:(0) 000 000}, '{1:000:000:000:000:000}'", 1234567890, -25);
      // (1234) 567 890, '-000:000:000:000:025'

      // пользовательское форматирование (тройки, разделенные пробелами)
      Console.WriteLine(string.Format(new TriplexFormatProvider(), "{0:Tx} | {1:Tx}", 1234567890, -25));
      // 1 234 567 890 |  -25

      // в системных деньгах 
      Console.WriteLine("{0:C}", 99.98);
      // 99,98р.

      // в указанных деньгах
      Console.WriteLine(string.Format(CultureInfo.CreateSpecificCulture("en-US").NumberFormat, "{0:C}", 99.99 ));
      // $99.99
      Console.WriteLine(string.Format(CultureInfo.CreateSpecificCulture("ru-RU").NumberFormat, "{0:C}", 99.99));
      // 99,99р

      // принудительная замена десятичного разделителя на точку
      var NFI = new CultureInfo(CultureInfo.CurrentCulture.LCID).NumberFormat;
      NFI.NumberDecimalSeparator = ".";
      Console.WriteLine(string.Format(NFI, "{0} {1}", 1.48, -24.01));
      // 1.48 -24.01

      Console.ReadLine();
    }
  }

  // замена даты на Вчера/Сегодня/Завтра
  public class HumanDateFormatProvider : IFormatProvider, ICustomFormatter
  {
    private static readonly string formatCode = "Hdt";

    public object GetFormat(Type formatType)
    {
      if (formatType == typeof(ICustomFormatter))
        return this;
      else
        return null;
    }

    public string Format(string format, object arg, IFormatProvider formatProvider)
    {
      if (format == null || !format.StartsWith(formatCode))
      {
        if (arg is IFormattable)
          return ((IFormattable)arg).ToString(format, formatProvider);
        else
          return arg.ToString();
      }

      if (arg.GetType() == typeof(DateTime))
      {
        DateTime dt = (DateTime)arg;
        Int64 onedayticks = 864000000000;
        DateTime nowdt = DateTime.Now;
        Int64 deltaticks = nowdt.Ticks - dt.Ticks;

        if (Math.Abs(deltaticks) < onedayticks * 2)
        {
          if (nowdt.Day == dt.Day)
            return string.Format("Сегодня {0:HH:mm:ss}", dt);
          else
          {
            if (deltaticks >= 0 && dt.Day == nowdt.AddDays(-1).Day)
              return string.Format("Вчера {0:HH:mm:ss}", dt);
            else
            {
              if (deltaticks < 0 && dt.Day == nowdt.AddDays(1).Day)
                return string.Format("Завтра {0:HH:mm:ss}", dt);
              else
                return string.Format("{0:dd.MM.yyyy HH:mm:ss}", dt);
            }
          }
        }
        else
          return string.Format("{0:dd.MM.yyyy HH:mm:ss}", dt);
      }
      else
        return arg.ToString();
    }
  }

  // разбиение длинных чисел на тройки разделенные пробелами 
  // для улучшения читабельности
  public class TriplexFormatProvider : IFormatProvider, ICustomFormatter
  {
    private static readonly string formatCode = "Tx";

    public object GetFormat(Type formatType)
    {
      if (formatType == typeof(ICustomFormatter))
        return this;
      else
        return null;
    }

    public string Format(string format, object arg, IFormatProvider formatProvider)
    {
      if (format == null || !format.StartsWith(formatCode))
      {
        if (arg is IFormattable)
          return ((IFormattable)arg).ToString(format, formatProvider);
        else
          return arg.ToString();
      }

      string s = arg.ToString();

      if (arg.GetType() == typeof(int) ||
            arg.GetType() == typeof(long) ||
            arg.GetType() == typeof(short) ||
              arg.GetType() == typeof(Int64) ||
                arg.GetType() == typeof(uint) ||
                    arg.GetType() == typeof(ulong) ||
                    arg.GetType() == typeof(ushort) ||
                      arg.GetType() == typeof(UInt64))
      {
        for (int i = s.Length - 3; i >= 0; i = i - 3)
          s = s.Insert(i, " ");
      }

      return s;
    }
  }
}

Комментариев нет:

Отправить комментарий