我写这个问题是因为我正在寻求最好的方法来做到这一点。我的程序中有很多这样的内容,我想创建一种方法将包含计时器秒数的 Int32 转换为格式良好的字符串。
例如,如果我的计时器 int 为 at,可以说一个随机数,例如 16429
这将是:
4 hours, 32 minutes and 9 seconds
如果是 600,则为:
10 minutes
如果是60的话那就是
1 minute
如果是172801,那就是
2 days and 1 second
如果是32的话就是
32 seconds
我希望每个单词末尾的“s”,如“分钟”、“秒”和“日”,仅在不等于1时才添加S,因此实际上不需要正确发音。我也只想要天和小时以及其他需要添加的内容,因此如果计时器低于 1 天(以秒为单位),它只显示小时、分钟和秒,或者需要的内容。
实现这样的目标的最佳方法是什么?我在下面有这个函数,但它非常混乱,只能达到分钟和秒,而不是小时或天:
public static string GetConvertedTime(int timer)
{
int Minutes = timer / 60;
int Seconds = timer - Minutes * 60;
if (timer < 60)
{
string secs = (Seconds != 1) ? "s" : "";
return "" + timer + " second" + secs;
}
else
{
if (Seconds < 1)
{
string mins = (Minutes != 1) ? "s" : "";
return "" + Minutes + " minute" + mins;
}
else
{
string mins = (Minutes != 1) ? "s" : "";
string secs = (Seconds != 1) ? "s" : "";
return "" + Minutes + " minute" + mins + " and " + Seconds + " second" + secs;
}
}
}
做到这一点的最佳方法到底是什么?
“最好的方法”是非常主观的。 DRY 通常是最好的,考虑到本地化和非常规复数形式通常是最好的,保持简短和活泼通常是最好的:
public static string FriendlyDuration(int seconds) {
int[] divisors = { 60 * 60 * 24, 60 * 60, 60 , 1};
string[] language = { ", ", " and ", "days", "day", "hours", "hour", "minutes", "minute", "seconds", "second"};
var parts = new List<string>();
for (int part = 0; part < divisors.Length; ++part) {
int count = seconds / divisors[part];
if (count == 0) continue;
string unit = language[part*2 + (count == 1 ? 3 : 2)];
parts.Add(string.Format("{0} {1}", count, unit));
seconds -= count * divisors[part];
}
var result = string.Join(language[0], parts.ToArray());
if (parts.Count > 1) {
var ix = result.LastIndexOf(language[0]);
result = result.Substring(0, ix) + language[1] + result.Substring(ix + language[0].Length);
}
return result;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)