Добавьте метод расширения ToString в структуру TimeSpan в C#
До версии .NET Framework 4.0 вы не смогли бы передать ToString структуру TimeSpan структуры формата, поэтому результат всегда был в форме hh: mm: ss .fffffff где hh - часы, мм - минуты, ss - секунды, а fffffff - 7 цифр дробных секунд. Если вы измеряете промежутки времени всего за минуты или секунды, кажется, что глупо отображать часы. Аналогичным образом, если вы измеряете продолжительность в часах, может не иметь смысла показывать 7 цифр точности.
Я пишу много программ, используя старые версии .NET Framework, и мне часто приходится отображать отформатированные TimeSpan s, показывающие прошедшее время, поэтому я написал этот метод расширения. Если вы используете .NET Framework 4.0 или новее, используйте версию фрейма ToString для форматирования TimeSpan s, но если вы используете более раннюю версию, вы можете использовать следующий метод расширения для добавления простого форматирования в объекты TimeSpan. (Вы также можете найти методы анализа, которые он использует интересными.)
// Добавить метод ToString для TimeSpan, который принимает строку формата. public static string ToString(this TimeSpan ts, string format) { string result = ""; // Разделим строку формата в // буквенные и неалфавитные произведения. Regex reg_exp = new Regex("[a-z]+|[^a-z]+"); MatchCollection matches = reg_exp.Matches(format.ToLower()); // Обработаем куски. foreach (Match piece in matches) { // Создаем формат для значения. string piece_format = new string('0', piece.Value.Length); // Изучите первый символ пьесы. switch (piece.Value[0]) { case 'd': // Дни. result += ts.Days.ToString(piece_format); break; case 'h': // Hours. result += ts.Hours.ToString(piece_format); break; case 'm': // Минуты. result += ts.Minutes.ToString(piece_format); break; case 's': // Seconds. result += ts.Seconds.ToString(piece_format); break; case 'f': // Дробные секунды. // Получить только дробные секунды. double fraction = ts.TotalSeconds - (int)ts.TotalSeconds; // Перемещение цифр слева от десятичной точки. fraction *= Math.Pow(10, piece.Value.Length); result += fraction.ToString(piece_format); break; default: // Неалфавитная фигура. Использовать как есть. result += piece.Value; break; } } return result; }
В методе используется объект регулярного выражения Regex для анализа строки формата в алфавитном и неалфавитированном фрагменте. Типичная строка формата может выглядеть как hh: mm: ss.f. В этом случае части строки будут hh /: / mm /: / ss /./ f /.
Код получает набор совпадений объектов Regex, а затем проходит через них. Для каждого совпадения код создает строку piece_format, содержащую 0 для каждой буквы в матче. Например, если фрагмент строки формата hhh, то piece_format равен 000. (Для неалфавитных элементов, таких как::, код создает piece_format, но doesn ' t использовать его.)
Затем код использует оператор switch для проверки первого символа фрагмента формата. (Предполагается, что все символы в алфавитном фрагменте одинаковы.) Если часть начинается с d, h, m или s, код добавляет количество дней TimeSpan, часов , минут или секунд до результата, используя piece_format в качестве строки формата.
Если часть начинается с f, код вычитает целое число секунд, прошедшее от общего количества прошедших секунд, чтобы получить дробное число секунд. Чтобы отформатировать это число как цифры без добавления дополнительной десятичной точки, код умножает его на десять, чтобы переместить все нужные цифры слева от десятичной точки. Затем он форматирует значение как целое число, которое содержит требуемое количество цифр.
Если фрагмент не является алфавитным (например, «:» или «,»), код включает его в результат как есть.
После построения строки результата метод просто возвращает его.