从十进制开始的小时和分钟的C#字符串格式

从十进制开始的小时和分钟的C#字符串格式,c#,.net,string-formatting,C#,.net,String Formatting,是否有一种简单的字符串格式,它采用十进制表示小时和小时分数,并显示为小时和分钟 例如:5.5格式化为显示5小时30分钟 我很乐意自己编写代码,但是如果现有功能可用,我更愿意使用它 decimal t = 5.5M; Console.WriteLine(TimeSpan.FromHours((double)t).ToString()); 这将给你“05:30:00”,这是非常接近。然后,您可以将其格式化为所需的结果: var ts = TimeSpan.FromHours((double)t);

是否有一种简单的字符串格式,它采用十进制表示小时和小时分数,并显示为小时和分钟

例如:5.5格式化为显示5小时30分钟

我很乐意自己编写代码,但是如果现有功能可用,我更愿意使用它

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

请注意,从十进制到双精度的转换可能会丢失准确性,但我认为在分钟刻度上不会明显。对类型系统有类似双向飞碟的理解的人可能可以在这里插话。

我根据马特的评论为此编写了一些小助手方法。也许有人可以帮你自己写

/// <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;
}
///将十进制转换为1小时30分钟
///转换为双精度的时间
/// 
///以以下格式返回字符串:
///x小时x分钟
///x小时(如果没有分钟)
///x分钟(如果没有小时)
///如果需要,也将使单词多元化,例如1小时或3小时
/// 
公共字符串转换器DecimaltoHoursminutes(双倍时间)
{
TimeSpan TimeSpan=TimeSpan.FromHours(时间);
整数小时=时间跨度小时;
int mins=时间跨度分钟;
//转换为小时和分钟
字符串hourString=(小时数>0)?String.Format(“{0}”+multilateTime(小时数),“小时数”):”;
String minString=(mins>0)?String.Format(“{0}”+multilateTime(mins,“minute”),mins:”;
//如有必要,在小时和分钟之间添加一个空格
返回(小时>0&&分钟>0)?小时字符串+“”+分钟字符串:小时字符串+分钟字符串;
}
///根据时间量,将小时或分钟多元化
///小时数或分钟数
///要多元化的词,例如“小时”或“分钟”
///返回正确的英语多元化,例如3小时、1分钟、0分钟
公共字符串时间(int num,字符串字)
{
返回(num==0 | | num>1)?word+“s”:word;
}

<>代码> 如果你有超过24小时的时间,你必须考虑TimeScript类有一天属性,并且小时属性将循环。这样可以防止任何超过24小时的时间错误:

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

很好,我没有想到使用TimeSpan(我可能应该这么做:))。我添加了更多的格式来隐藏0:string.Format(“{0}hrs{1}”,ts.Hours,ts.minutes>0?string.Format(“{0}”,ts.minutes):”);好主意。我在Reporting Services报告中也使用过类似的TimeSpan,以获得人类可读的时间跨度。这是一个很好的技巧。第二个例子是,如果你有时间跨度>24小时,就要避免。