/// <summary> Formats a timespan to a string like "3 min 4 sec". </summary> /// /// <param name="timespan"> The timespan. </param> /// <param name="verbosity"> The verbosity. </param> /// <param name="unitSpacer"> true to insert a space before each unit. </param> /// <param name="includeZeros"> true to include those parts of the timespan that are zero, /// starting with hours, e.g. "0h 2m 0s" instead of just "2m". </param> /// <param name="includeSplitSeconds"> true to include, false to exclude the fractions of the second portion. </param> /// <param name="numberFormatCulture"> The Culture to use for number formatting. Since /// milliseconds are displayed as fractions of seconds, this /// effects the decimal delimiter. By default, the /// DefaultThreadCurrentCulture is used. </param> /// /// <returns> The formatted value. </returns> public static string Format(TimeSpan timespan, FormatVerbosities verbosity = FormatVerbosities.Normal, bool unitSpacer = true, bool includeZeros = true, bool includeSplitSeconds = true, CultureInfo numberFormatCulture = null) { string result = ""; if (verbosity == FormatVerbosities.SuperBrief) { result = timespan.ToString(); // The system's ToString() will add a fixed number of 0 for the millisecond fraction (e.g. 12:30:05.1200000) // but we want to return only the significant digits if (timespan.Milliseconds != 0) { result = result.TrimEnd('0'); } } else { string unitInsert = unitSpacer ? " " : ""; result += CreateUnitString(timespan.Days, C_DAY_UNITS[verbosity], unitInsert, createIfZero: false, numberFormatCulture: numberFormatCulture); result += CreateUnitString(timespan.Hours, C_HOUR_UNITS[verbosity], unitInsert, includeZeros, numberFormatCulture: numberFormatCulture); result += CreateUnitString(timespan.Minutes, C_MINUTE_UNITS[verbosity], unitInsert, includeZeros, numberFormatCulture: numberFormatCulture); result += CreateUnitString(timespan.Seconds + (includeSplitSeconds ? timespan.Milliseconds / 1000.0 : 0), C_SECOND_UNITS[verbosity], unitInsert, includeZeros, numberFormatCulture: numberFormatCulture); } return(result.Trim());; }
/// <summary> /// Time span format attribute. /// </summary> /// <param name="allowNone"></param> /// <param name="allowNegative"></param> /// <param name="verbosity"></param> public TimeSpanFormatAttribute(bool allowNone = false, bool allowNegative = false, FormatVerbosities verbosity = FormatVerbosities.Normal) { AllowNone = allowNone; AllowNegative = allowNegative; Verbosity = verbosity; }