пятница, 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;
    }
  }
}

четверг, 28 июня 2012 г.

Myerchin P300 - нож для яхтсменов и ... кендок :)



В самом деле, Myerchin P300 хоть и называется Sailor's Knife, практически идеально подходит для занимающихся кендо.

Во-первых, в нем есть такая полезная вещь как свайка -


Свайкой удобно расковыривать сильно затянутые узлы nakayui или tsuru:


Или расширить kawa-himo, чтоб протолкнуть туда последний виток tsuru


Если остаток nakayui слишком короткий, чтоб при затягивании хорошо захватить его пальцами - помогут плоскогубцы -


Серейтор на лезвии (как всегда) - самая неудачная мысль авторов ножа. Ну и материал клинка - к сожалению, безымянная Stainless China :(


Но, впрочем, и в таком виде лезвие вполне подходит для заглаживания заусенец на синае:


Есть клипса для крепления ножа на кармане или за поясом:


И лезвие и свайка в открытом состоянии надёжно фиксируются замком типа liner lock -


Я заказывал сей инструмент в Sound Boatworks - доставили (Priority mail USPS) через 17 дней после оплаты.

понедельник, 25 июня 2012 г.

Бег Чистой воды 2012 - фото

24.06.2012

Место старта - Тургояк, городской пляж. Погоды благоприятствуют, в отличии от.


Равняйсь-смирна


Настарт-внимание-марш






Поворот на Инышку


А туда-ли я бегу?






Догнать и перегнать


А в прошлом-то году марафон был ВОТ ТАКОЙ, 42 км, но в прошлом, но 42, но с дождём, но 42


"Вокруг Тургояка за 80 дней" ;)


- Не пора ли нам по красенькой таблеточке, мистер Смит?
- Сначала надо догнать Морфиуса, мистер Смит :(




Между первой и второй - перерывчик небольшой


Хорошо пошла!




Ну шо за трасса такая, одни горы и пригорки!










А в этом году 30 км, но без дождя, но 30, но в этом году


Эти и 400 других фоток - в альбоме Бег Чистой воды 2012

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

PearlTrees - Kendo Clubs

Kendo clubs in Kendo / Fencing / Martial Art / Alexey Kiryushkin (alexeykiryushkin)

Долго искал нормальный сервис онлайн-закладок, чтоб можно было с любого компа иметь к ним доступ, вроде PearlTrees вполне симпатично смотрятся.
Сервис еще позиционируется как социальная сеть - можно шариться по чужим закладкам, писать комменты, помечать, копировать себе, но что-то в этом плане пока дохленько совсем :( народу что-ли маловато.

четверг, 7 июня 2012 г.

Бег Чистой Воды - 24.06.2012

Как и обещали в прошлом году старт и финиш перенесли с Машгородка на берег Тургояка и в связи с этим сократили дистанцию до 30 км.






UPD от 18.06.2012 - Вчера проехался по трассе марафона забега, она уже размечена, в обычном минималистическом стиле, т.е там где организаторы считают, что можно свернуть не туда - висят краснобелые ленточки, в принципе понятно, но можно пробежать километров 10, пока встретишь очередной поворот и очередную ленту. Наверняка тем кто побежит по этой трассе первый раз будет слегка неуютно :) бежать вот так и по 10 км не видеть подтверждения, что бежишь туда куда надо.
Отличие от прошлогодней трассы (кроме старта не с Машгородка, а с пляжа) начинается ближе к концу, после выхода на бетонку, после пробега мимо всех баз и лагерей, немного недобегая до выезда на трассу Златоуст-Миасс, будет поворот налево, на "Жемчужину Урала", он размечен, а дальше, ближе к концу этого аппендикса - съезд направо, на полу-грунтовку, полу-тропинку до финиша.
Трасса практически сухая, но за неделю еще всякое может - и залить и засушить.

UPD от 24.06.2012 - фото с забега