Формат строки С# для часов и минут из десятичной - программирование
Подтвердить что ты не робот

Формат строки С# для часов и минут из десятичной

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

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

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

4b9b3361

Ответ 1

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);

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

Ответ 2

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

/// <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 no minutes)
///     x minutes (if there 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;
}

Ответ 3

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

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