Bitte helfen Sie mir. Ich muss das Datum 03.03.2012 als 3. März 2012 angeben
Sie können dazu einen eigenen benutzerdefinierten Formatanbieter erstellen:
public class MyCustomDateProvider: IFormatProvider, ICustomFormatter
{
public object GetFormat(Type formatType)
{
if (formatType == typeof(ICustomFormatter))
return this;
return null;
}
public string Format(string format, object arg, IFormatProvider formatProvider)
{
if (!(arg is DateTime)) throw new NotSupportedException();
var dt = (DateTime) arg;
string suffix;
if (new[] {11, 12, 13}.Contains(dt.Day))
{
suffix = "th";
}
else if (dt.Day % 10 == 1)
{
suffix = "st";
}
else if (dt.Day % 10 == 2)
{
suffix = "nd";
}
else if (dt.Day % 10 == 3)
{
suffix = "rd";
}
else
{
suffix = "th";
}
return string.Format("{0:MMMM} {1}{2}, {0:yyyy}", arg, dt.Day, suffix);
}
}
Dies kann dann so aufgerufen werden:
var formattedDate = string.Format(new MyCustomDateProvider(), "{0}", date);
Ergebnis (zum Beispiel):
3. März 2012
Humanizer erfüllt alle Ihre .NET-Anforderungen zur Bearbeitung und Anzeige von Zeichenfolgen, Aufzählungen, Datumsangaben, Uhrzeiten, Zeiträumen, Zahlen und Mengen
Führen Sie zum Installieren von Humanizer den folgenden Befehl in der Package Manager Console aus
PM> Install-Package Humanizer
Ordinalize wandelt eine Zahl in eine Ordinalzeichenfolge um, die verwendet wird, um die Position in einer geordneten Reihenfolge zu bezeichnen, z. B. 1st, 2nd, 3rd, 4th:
1.Ordinalize() => "1st"
5.Ordinalize() => "5th"
Dann können Sie verwenden:
String.Format("{0} {1:MMMM yyyy}", date.Day.Ordinalize(), date)
Benutzerdefinierte Datums- und Zeitformat-Zeichenfolgen
date.ToString("MMMM d, yyyy")
Oder wenn Sie auch das "rd" brauchen:
string.Format("{0} {1}, {2}", date.ToString("MMMM"), date.Day.Ordinal(), date.ToString("yyyy"))
Ordinal()
-Methode kann gefunden werden hierpublic static class IntegerExtensions
{
/// <summary>
/// converts an integer to its ordinal representation
/// </summary>
public static String AsOrdinal(this Int32 number)
{
if (number < 0)
throw new ArgumentOutOfRangeException("number");
var work = number.ToString("n0");
var modOf100 = number % 100;
if (modOf100 == 11 || modOf100 == 12 || modOf100 == 13)
return work + "th";
switch (number % 10)
{
case 1:
work += "st"; break;
case 2:
work += "nd"; break;
case 3:
work += "rd"; break;
default:
work += "th"; break;
}
return work;
}
}
Beweis:
[TestFixture]
class IntegerExtensionTests
{
[Test]
public void TestCases_1s_10s_100s_1000s()
{
Assert.AreEqual("1st", 1.AsOrdinal());
Assert.AreEqual("2nd", 2.AsOrdinal());
Assert.AreEqual("3rd", 3.AsOrdinal());
foreach (var integer in Enumerable.Range(4, 6))
Assert.AreEqual(String.Format("{0:n0}th", integer), integer.AsOrdinal());
Assert.AreEqual("11th", 11.AsOrdinal());
Assert.AreEqual("12th", 12.AsOrdinal());
Assert.AreEqual("13th", 13.AsOrdinal());
foreach (var integer in Enumerable.Range(14, 6))
Assert.AreEqual(String.Format("{0:n0}th", integer), integer.AsOrdinal());
Assert.AreEqual("21st", 21.AsOrdinal());
Assert.AreEqual("22nd", 22.AsOrdinal());
Assert.AreEqual("23rd", 23.AsOrdinal());
foreach (var integer in Enumerable.Range(24, 6))
Assert.AreEqual(String.Format("{0:n0}th", integer), integer.AsOrdinal());
Assert.AreEqual("31st", 31.AsOrdinal());
Assert.AreEqual("32nd", 32.AsOrdinal());
Assert.AreEqual("33rd", 33.AsOrdinal());
//then just jump to 100
Assert.AreEqual("101st", 101.AsOrdinal());
Assert.AreEqual("102nd", 102.AsOrdinal());
Assert.AreEqual("103rd", 103.AsOrdinal());
foreach (var integer in Enumerable.Range(104, 6))
Assert.AreEqual(String.Format("{0:n0}th", integer), integer.AsOrdinal());
Assert.AreEqual("111th", 111.AsOrdinal());
Assert.AreEqual("112th", 112.AsOrdinal());
Assert.AreEqual("113th", 113.AsOrdinal());
foreach (var integer in Enumerable.Range(114, 6))
Assert.AreEqual(String.Format("{0:n0}th", integer), integer.AsOrdinal());
Assert.AreEqual("121st", 121.AsOrdinal());
Assert.AreEqual("122nd", 122.AsOrdinal());
Assert.AreEqual("123rd", 123.AsOrdinal());
foreach (var integer in Enumerable.Range(124, 6))
Assert.AreEqual(String.Format("{0:n0}th", integer), integer.AsOrdinal());
//then just jump to 1000
Assert.AreEqual("1,001st", 1001.AsOrdinal());
Assert.AreEqual("1,002nd", 1002.AsOrdinal());
Assert.AreEqual("1,003rd", 1003.AsOrdinal());
foreach (var integer in Enumerable.Range(1004, 6))
Assert.AreEqual(String.Format("{0:n0}th", integer), integer.AsOrdinal());
Assert.AreEqual("1,011th", 1011.AsOrdinal());
Assert.AreEqual("1,012th", 1012.AsOrdinal());
Assert.AreEqual("1,013th", 1013.AsOrdinal());
foreach (var integer in Enumerable.Range(1014, 6))
Assert.AreEqual(String.Format("{0:n0}th", integer), integer.AsOrdinal());
Assert.AreEqual("1,021st", 1021.AsOrdinal());
Assert.AreEqual("1,022nd", 1022.AsOrdinal());
Assert.AreEqual("1,023rd", 1023.AsOrdinal());
foreach (var integer in Enumerable.Range(1024, 6))
Assert.AreEqual(String.Format("{0:n0}th", integer), integer.AsOrdinal());
}
}
Nein, es gibt nichts in string.Format (), das Ihnen Ordinalzahlen gibt (1., 2., 3., 4. usw.).
Sie können das Datumsformat wie in anderen Antworten vorgeschlagen kombinieren, mit Ihrer eigenen Ordinalzahl, wie zum Beispiel in dieser Antwort vorgeschlagen
Gibt es eine einfache Möglichkeit, Ordinalzahlen in C # zu erstellen?
string Format(DateTime date)
{
int dayNo = date.Day;
return string.Format("{0} {1}{2}, {3}",
date.ToString("MMMM"), dayNo, AddOrdinal(dayNo), date.Year);
}
Basierend auf Rob Levines Antwort und den Kommentaren zu dieser Antwort ... Ich habe DateTime als Erweiterungsmethode angepasst, so dass Sie einfach anrufen können:
var formattedDate = date.Friendly();
Hier ist die Erweiterungsmethode:
public static class DateFormatter
{
public static string Friendly(this DateTime dt)
{
string suffix;
switch (dt.Day)
{
case 1:
case 21:
case 31:
suffix = "st";
break;
case 2:
case 22:
suffix = "nd";
break;
case 3:
case 23:
suffix = "rd";
break;
default:
suffix = "th";
break;
}
return string.Format("{0:MMMM} {1}{2}, {0:yyyy}", dt, dt.Day, suffix);
}
}
Hier ist eine weitere Version der Erweiterung Ordinalize (), kurz und bündig:
public static string Ordinalize(this int x)
{
return x.ToString() +
((x % 10 == 1 && x != 11)
? "st"
: (x % 10 == 2 && x != 12)
? "nd"
: (x % 10 == 3 && x != 13)
? "rd"
: "th");
}
und dann nennen Sie diese Erweiterung so
myDate.Day.Ordinalize()
oder
myAnyNumber.Ordinalize()