public static string ToString(this TimeSpan thisValue, TimeUnit input, byte millisecondsLength = 3, bool millisecondsAreOptional = false) { StringBuilder sb = new StringBuilder(16); millisecondsLength = millisecondsLength.Within((byte)0, (byte)7); switch (input) { case TimeUnit.None: break; case TimeUnit.Millisecond: if (millisecondsLength > 0) { char f = millisecondsAreOptional ? 'F' : 'f'; string fs = new string(f, millisecondsLength); sb.Append(fs); } break; case TimeUnit.Second: sb.Append("ss"); break; case TimeUnit.Minute: sb.Append("mm"); break; case TimeUnit.Hour: sb.Append("hh"); break; case TimeUnit.Day: sb.Append("dd"); break; case TimeUnit.Hour | TimeUnit.Minute: sb.Append(HOURS_MINUTES); break; case TimeUnit.Day | TimeUnit.Hour | TimeUnit.Minute: sb.Append(DAYS_HOURS_MINUTES); break; case TimeUnit.Hour | TimeUnit.Minute | TimeUnit.Second: sb.Append(HOURS_MINUTES_SECONDS); break; case TimeUnit.Day | TimeUnit.Hour | TimeUnit.Minute | TimeUnit.Second: sb.Append(DAYS_HOURS_MINUTES_SECONDS); break; case TimeUnit.Hour | TimeUnit.Minute | TimeUnit.Second | TimeUnit.Millisecond: sb.Append(HOURS_MINUTES_SECONDS); if (millisecondsLength > 0) { char f = millisecondsAreOptional ? 'F' : 'f'; string fs = new string(f, millisecondsLength); sb.Append(DOT_SEP); sb.Append(fs); } break; case TimeUnit.Day | TimeUnit.Hour | TimeUnit.Minute | TimeUnit.Second | TimeUnit.Millisecond: sb.Append(DAYS_HOURS_MINUTES_SECONDS); if (millisecondsLength > 0) { char f = millisecondsAreOptional ? 'F' : 'f'; string fs = new string(f, millisecondsLength); sb.Append(DOT_SEP); sb.Append(fs); } break; default: string separator = COL_SEP; if (input.FastHasFlag(TimeUnit.Day)) { sb.Append('d'); separator = DOT_SEP; } if (input.FastHasFlag(TimeUnit.Hour)) { if (sb.Length > 0) { sb.Append(separator); separator = COL_SEP; } sb.Append("hh"); } if (input.FastHasFlag(TimeUnit.Minute)) { if (sb.Length > 0) { sb.Append(separator); separator = COL_SEP; } sb.Append("mm"); } if (input.FastHasFlag(TimeUnit.Second)) { if (sb.Length > 0) { sb.Append(separator); } sb.Append("ss"); } if (input.FastHasFlag(TimeUnit.Millisecond)) { if (millisecondsLength > 0) { char f = millisecondsAreOptional ? 'F' : 'f'; string fs = new string(f, millisecondsLength); if (sb.Length > 0) { sb.Append(DOT_SEP); } sb.Append(fs); } } break; } if (sb.Length == 1) { sb.Insert(0, '%'); } return(thisValue.ToString(sb.ToString())); }