it-swarm.com.de

Wie kann ich den 07.03.2012 bis 7. März 2012 in c # formatieren?

Bitte helfen Sie mir. Ich muss das Datum 03.03.2012 als 3. März 2012 angeben

26

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

45
Rob Levine

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)
26
regisbsb

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"))
  • die Ordinal()-Methode kann gefunden werden hier
10
CD..
public 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());
    }
}
3
AaronHS

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); 
}
3
Anders Forsgren

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);
  }
}
2
dprothero

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() 
0
Amine Boulaajaj