Format Une Plage De Temps, Avec Les Années

J'ai une classe avec 2 propriétés de date: FirstDay et LastDay. LastDay est nullable. Je voudrais générer une chaîne de caractères dans le format de "x year(s) y day(s)". Si le nombre total d'années de moins d ' 1, je voudrais d'omettre l'année la section. Si le nombre total de jours à moins de 1, je voudrais d'omettre le jour de la section. Si l'une d'années, de jours sont 0, ils doivent dire "jour/année", plutôt que "jours/années", respectivement.

Exemples:

2.2 ans:             "2 ans 73 jours"

1.002738 ans:   "1 an 1 jour"

0.2 années:             "73 jours"

2 years:                "2 ans"

Ce que j'ai fonctionne, mais c'est long:

private const decimal DaysInAYear = 365.242M;

public string LengthInYearsAndDays
{
    get
    {
        var lastDay = this.LastDay ?? DateTime.Today;
        var lengthValue = lastDay - this.FirstDay;

        var builder = new StringBuilder();

        var totalDays = (decimal)lengthValue.TotalDays;
        var totalYears = totalDays / DaysInAYear;
        var years = (int)Math.Floor(totalYears);

        totalDays -= (years * DaysInAYear);
        var days = (int)Math.Floor(totalDays);

        Func<int, string> sIfPlural = value =>
            value > 1 ? "s" : string.Empty;

        if (years > 0)
        {
            builder.AppendFormat(
                CultureInfo.InvariantCulture,
                "{0} year{1}",
                years,
                sIfPlural(years));

            if (days > 0)
            {
                builder.Append(" ");
            }
        }

        if (days > 0)
        {
            builder.AppendFormat(
                CultureInfo.InvariantCulture,
                "{0} day{1}",
                days,
                sIfPlural(days));
        }

        var length = builder.ToString();
        return length;
    }
}

Est-il une manière plus concise de le faire (mais toujours lisible)?

InformationsquelleAutor Dan | 2013-04-11