Вопрос

Так, например, скажем, когда я строчу.

т.е.

string.Format("{0:ddor MMM yyyy}.", DateTime.Now)

должен вывозить

1st Jan 2010

См. Ниже, как вывести порядковые числа

Есть ли простой способ получить «ST», «ND», «RD» и «Th» для чисел?

Это было полезно?

Решение

Кажется, нет что -то подобного.

Самый рекомендуемый способ сделать это:

var d = DateTime.Now;
var result2 = String.Format("{0:dd}{1} {2:MMM yyyy}", d, Ordinal(d.Day), d);

Очень хакерский способ достичь этого - создать пользовательский IFormatProvider. Анкет ИМО, это всего лишь много проблем, но просто чтобы показать альтернативный путь ... (у меня мало опыта с этим, это может быть не очень "правильным")

using System;

namespace Test
{
    class Program
    {
        public static string Ordinal(int number)
        {
            string suffix = String.Empty;

            int ones = number % 10;
            int tens = (int)Math.Floor(number / 10M) % 10;

            if (tens == 1)
            {
                suffix = @"\t\h";
            }
            else
            {
                switch (ones)
                {
                    case 1:
                        suffix = @"\s\t";
                        break;

                    case 2:
                        suffix = @"\n\d";
                        break;

                    case 3:
                        suffix = @"\r\d";
                        break;

                    default:
                        suffix = @"\t\h";
                        break;
                }
            }
            return suffix;
        }

        public class MyFormat : IFormatProvider, ICustomFormatter
        {
            public object GetFormat(Type formatType)
            {
                return (formatType == typeof(ICustomFormatter)) ? this : null;

            }

            public string Format(string format, object arg, IFormatProvider formatProvider)
            {
                var d = (DateTime)arg;

                var or = Ordinal(d.Day);

                format = format.Replace("or", or);

                return d.ToString(format);
            }
        }
        static void Main(string[] args)
        {
            var result = String.Format(new MyFormat(), "{0:ddor MMM yyyy}.", DateTime.Now);

            return;
        }
    }
}

Больше информации о пользовательском iformatprovider

Другие советы

Поставщики формата подключены, но, насколько я знаю, вы не можете настроить поставщика формата по умолчанию для данного типа. Методы, которые принимают строки формата по соглашению, обычно также имеют перегрузку, которая принимает iFormatProvider. Вы можете внедрить два класса, такие как MyFormatProvider: Iformatprovider и mycustomformatter: Icustomformatter.

Когда строка формата, такая как «{0: dd} {0: или} {0: mmm} {0: yyyy}», обрабатывается, ваш icustomformatter будет вызоваться 4 раза, с «dd», или «,« ммм "и" yyyy "как параметры, чтобы он мог отформатировать каждую часть отдельно. Вам просто нужно обратиться к делу «или» и передать остальное поставщику формата по умолчанию.

Тем не менее, абоненту все еще нужно будет пройти в экземпляре вашего поставщика пользовательского формата при форматировании. Например:

string str = String.Format(MyFormatProvider.Default, "{0:dd}{0:or} {0:MMM} {0:yyyy}", date);

Насколько я знаю, этого требования нельзя избежать. Я искал лучший путь некоторое время назад, когда создал «относительную» строку формата DateTime, которая отображала дату, как «1 час назад», «3 дня назад» и т. Д. Не мог понять, чтобы избежать необходимости явно явно Пропустите мой пользовательский iFormatProvider.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top