Возможно, результат немного отличается от запрошенного, но результат понятен человеку, и его можно адаптировать для многих других случаев использования.
private static List<double> _intervals = new List<double>
{
1.0 / 1000 / 1000,
1.0 / 1000,
1,
1000,
60 * 1000,
60 * 60 * 1000
};
private static List<string> _units = new List<string>
{
"ns",
"µs",
"ms",
"s",
"min",
"h"
};
public string FormatUnits(double milliseconds, string format = "#.#")
{
var interval = _intervals.Last(i=>i<=milliseconds);
var index = _intervals.IndexOf(interval);
return string.Concat((milliseconds / interval).ToString(format) , " " , _units[index]);
}
Пример звонков ...
Console.WriteLine(FormatUnits(1));
Console.WriteLine(FormatUnits(20));
Console.WriteLine(FormatUnits(300));
Console.WriteLine(FormatUnits(4000));
Console.WriteLine(FormatUnits(50000));
Console.WriteLine(FormatUnits(600000));
Console.WriteLine(FormatUnits(7000000));
Console.WriteLine(FormatUnits(80000000));
... и результаты:
1000 µs
20 ms
300 ms
4 s
50 s
10 min
1.9 h
22.2 h