ここに役立つかもしれないものがあります:
string[] formats = {
"d' Days 'h' Hours 'm' Minutes 's' Seconds'",
"h' Hours 'm' Minutes 's' Seconds'",
"m' Minutes 's' Seconds'",
"s' Seconds'",
"d' Days 'h' Hours 'm' Minutes'",
"d' Days 'h' Hours 's' Seconds'",
"d' Days 'm' Minutes 's' Seconds'",
"h' Hours 'm' Minutes'",
"h' Hours 's' Seconds'",
};
var result = TimeSpan.ParseExact(yourString, formats, CultureInfo.CurrentCulture);
場合によっては違法になる可能性があることTryParseExact
を恐れている場合もあります。yourString
詳細については、カスタム TimeSpan フォーマット文字列を参照してください。
編集:アスカーは、「解析」ではなく「フォーマット」を望んでいることを明らかにしたため、私の答えは関係ないかもしれません。この回答で他に何が問題なのかわかりません。
さて、これが(テストされていない)解決策です。最も重要な部分がゼロの場合だけでなく、「中間」のゼロ部分も削除されます ( 01:00:01
)。文法 (複数形と単数形) は問題ないはずです。スペースは、中間と端で正しくなければなりません。クラスに入れますstatic
(拡張メソッド):
public static string ToMyString(this TimeSpan ts)
{
if (ts < TimeSpan.Zero)
throw new ArgumentOutOfRangeException();
var parts = new List<string>();
AddPart(parts, ts.Days, "Day");
AddPart(parts, ts.Hours, "Hour");
AddPart(parts, ts.Minutes, "Minute");
AddPart(parts, ts.Seconds, "Second");
if (parts.Count == 0)
return "0";
return string.Join(" ", parts);
}
static void AddPart(List<string> parts, int number, string name)
{
if (number == 1)
parts.Add("1 " + name);
else if (number > 1)
parts.Add(string.Format("{0} {1}s", number, name));
}