web-dev-qa-db-fra.com

Comment puis-je formater du 07/03/2012 au 7 mars 2012 en c #

S'il vous plaît, aidez-moi. J'ai besoin d'indiquer la date du 03/03/2012 comme 3 mars 2012

26
Sreenath Plakkat

Vous pouvez créer votre propre fournisseur de format personnalisé pour cela:

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

Ceci peut alors s'appeler comme ceci:

var formattedDate = string.Format(new MyCustomDateProvider(), "{0}", date);

Résultat (par exemple):

3 mars 2012

45
Rob Levine

Humanizer répond à tous vos besoins en .NET pour manipuler et afficher des chaînes, des énumérations, des dates, des heures, des périodes, des nombres et des quantités

Pour installer Humanizer, exécutez la commande suivante dans la console du gestionnaire de packages.

PM> Install-Package Humanizer

Ordinalize transforme un nombre en une chaîne ordinale utilisée pour désigner la position dans une séquence ordonnée telle que 1st, 2nd, 3rd, 4th:

1.Ordinalize() => "1st"
5.Ordinalize() => "5th"

Ensuite, vous pouvez utiliser:

String.Format("{0} {1:MMMM yyyy}", date.Day.Ordinalize(), date)
26
regisbsb

Chaînes de format de date et heure personnalisées

date.ToString("MMMM d, yyyy")

Ou si vous avez aussi besoin du "troisième":

string.Format("{0} {1}, {2}", date.ToString("MMMM"), date.Day.Ordinal(), date.ToString("yyyy"))
  • la méthode Ordinal() peut être trouvée ici
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;
    }
}

Preuve:

[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

Non, rien dans string.Format () ne vous donnera des ordinaux (1er, 2e, 3e, 4e et ainsi de suite).

Vous pouvez combiner le format de date comme suggéré dans d'autres réponses, avec votre propre ordinal comme suggéré par exemple dans cette réponse.

Y a-t-il un moyen facile de créer des ordinaux en C #?

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

Basé sur la réponse de Rob Levine et les commentaires sur cette réponse ... Je me suis adapté comme méthode d'extension sur DateTime afin que vous puissiez simplement appeler:

var formattedDate = date.Friendly();

Voici la méthode d'extension:

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

Voici une autre version de l'extension Ordinalize (), courte et douce:

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

puis appelez cette extension comme ça 

myDate.Day.Ordinalize()

ou

myAnyNumber.Ordinalize() 
0
Amine Boulaajaj