Frage

So zum Beispiel kann sagen, wenn ich ein Datum string.format und verwenden Sie die Zeichenfolge „oder“ in Formatmustern ich, dass mit dem Ordnungswert des Datums umgewandelt werden soll.

dh

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

ausgeben sollte

1st Jan 2010

Siehe unten, wie die Ordnungszahl abzuleiten

gibt es eine einfache Möglichkeit, in .NET zu erhalten "st", "nd", "rd" und "th" Endungen für Zahlen?

War es hilfreich?

Lösung

Es scheint, gibt es nicht so etwas wie es.

Der empfohlene Weg, es zu tun:

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

Ein sehr hacky Weg, es zu erreichen, ist eine benutzerdefinierte IFormatProvider zu erstellen. IMO ist es nur eine Menge Ärger, aber nur eine alternative Art und Weise zu zeigen ... (Ich habe nicht viel Erfahrung mit diesem, ist es vielleicht nicht sehr „richtige“)

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;
        }
    }
}

Weitere Informationen über kundenspezifische IFormatProvider

Andere Tipps

Format-Anbieter sind steckbar, aber soweit ich weiß, können Sie kein Standardformat Anbieter für eine bestimmte Art eingerichtet. Methoden, die Formatstrings vereinbarungs nehmen in der Regel auch eine Überlastung, die eine IFormatProvider nimmt. Sie können zwei Klassen wie MyFormatProvider implementieren: IFormatProvider und MyCustomFormatter: ICustomFormatter .

Wenn ein Formatstring wie "{0: dd} {0: oder} {0: MMM} {0: yyyy}" verarbeitet wird, wird Ihre ICustomFormatter 4 Mal aufgerufen werden, mit "dd", "oder" „MMM“, und „yyyy“ als Parameter, so dass es jedes Teil separat formatieren. Sie würden einfach den „oder“ Fall und gibt den Rest auf das Standardformat Provider zu behandeln.

Allerdings wird der Anrufer nach wie vor muß in einer Instanz der benutzerdefinierten Format-Provider übergeben, wenn die Formatierung. Zum Beispiel:

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

Soweit ich weiß, gibt es keine, diese Anforderung zu entkommen. Ich suchte nach einem besseren Weg einer Weile zurück, wenn ich hatte ein „relatives“ Datetime-Format-String erstellt, die Datetime wie „vor 1 Stunde“, „3 Tage“ angezeigt usw. kann nicht einen Weg finden, um zu vermeiden, ausdrücklich mit geben meine Gewohnheit IFormatProvider.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top