Ist String.Format und Datetime steckbaren / ausfahrbaren?
-
29-09-2019 - |
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
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.