我有一个类,其中包含两个日期属性:FirstDay
和LastDay
。其中LastDay
是可空的。我想生成一个格式为"x year(s) y day(s)"
的字符串。如果总年数少于1,则省略年部分。如果总天数少于1,则省略天部分。如果年份或天数为0,则它们应该分别说"day/year"而不是"days/years"。
示例:
2.2年: "2 years 73 days"
1.002738年: "1 year 1 day"
0.2年: "73 days"
2年: "2 years"
我的方法可以工作,但是很长:
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;
}
}
有更简洁但仍可读的方法吗?