Формат строки C # для часов и минут с десятичной точки - PullRequest
15 голосов
/ 02 мая 2011

Существует ли простой формат строки, который будет принимать десятичное число, представляющее часы и доли часов, и отображать его как часы и минуты?

Например: 5,5 отформатирован для отображения 5 часов 30 минут.

Я рад написать код сам, однако предпочел бы использовать существующую функциональность, если она доступна

Ответы [ 3 ]

28 голосов
/ 02 мая 2011
decimal t = 5.5M;
Console.WriteLine(TimeSpan.FromHours((double)t).ToString());

Это даст вам "05:30:00", что довольно близко.Затем вы можете отформатировать его так, чтобы получить желаемый результат:

var ts = TimeSpan.FromHours((double)t);
Console.WriteLine("{0} hrs {1} minutes", ts.Hours, ts.Minutes);

Обратите внимание, что существует вероятность потери точности при преобразовании из десятичного числа в двойное, но я не думаю, что это будет заметно на минутной шкале,Кто-то, имеющий скитоподобное понимание системы типов, мог бы здесь войти.

1 голос
/ 22 ноября 2012

Я написал несколько небольших вспомогательных методов для этого на основе комментария Мэтта.Может быть полезно, чтобы кто-то спас вас, написав это самостоятельно.

/// <summary>Converts a decimal e.g. 1.5 to 1 hour 30 minutes</summary>
/// <param name="duration">The time to convert as a double</param>
/// <returns>
///     Returns a string in format:
///     x hours x minutes
///     x hours (if there's no minutes)
///     x minutes (if there's no hours)
///     Will also pluralise the words if required e.g. 1 hour or 3 hours
/// </returns>
public String convertDecimalToHoursMinutes(double time)
{
    TimeSpan timespan = TimeSpan.FromHours(time);
    int hours = timespan.Hours;
    int mins = timespan.Minutes;

    // Convert to hours and minutes
    String hourString = (hours > 0) ? string.Format("{0} " + pluraliseTime(hours, "hour"), hours) : "";
    String minString = (mins > 0) ? string.Format("{0} " + pluraliseTime(mins, "minute"), mins) : "";

    // Add a space between the hours and minutes if necessary
    return (hours > 0 && mins > 0) ? hourString + " " + minString : hourString + minString;
}

/// <summary>Pluralise hour or minutes based on the amount of time</summary>
/// <param name="num">The number of hours or minutes</param>
/// <param name="word">The word to pluralise e.g. "hour" or "minute"</param>
/// <returns> Returns correct English pluralisation e.g. 3 hours, 1 minute, 0 minutes</returns>
public String pluraliseTime(int num, String word)
{
    return (num == 0 || num > 1) ? word + "s" : word;
}
0 голосов
/ 17 октября 2017

Если у вас есть время, которое может превышать 24 часа, вы должны учитывать, что класс TimeSpan имеет свойство Days, а свойство Hours будет циклически изменяться. Примерно так будет предотвращать любую ошибку со временем, превышающим 24 часа:

 var tsExample = TimeSpan.FromHours(timeInDecimal);
 var result = $"{tsExample.Hours + (tsExample.Days * 24):00}:{tsExample.Minutes:00}";
...