// Simply converts the failure rate to a MTBF number, without any string formatting
        public static double FailureRateToMTBF(double failureRate, MTBFUnits units)
        {
            failureRate = Math.Max(failureRate, MIN_FAILURE_RATE);
            double mtbfSeconds = 1.0f / failureRate;

            switch (units)
            {
            case MTBFUnits.SECONDS:
                return(mtbfSeconds);

            case MTBFUnits.MINUTES:
                return(mtbfSeconds / 60);

            case MTBFUnits.HOURS:
                return(mtbfSeconds / 60 / 60);

            case MTBFUnits.DAYS:
                return(mtbfSeconds / 60 / 60 / 24);

            case MTBFUnits.YEARS:
                return(mtbfSeconds / 60 / 60 / 24 / 365);

            default:
                return(mtbfSeconds);
            }
        }
        public static void FailureRateToMTBFString(double failureRate, MTBFUnits units, bool shortForm,
                                                   int maximum, out string output)
        {
            var currentUnit = (int)MTBFUnits.SECONDS;
            var mtbf        = FailureRateToMTBF(failureRate, (MTBFUnits)currentUnit);

            while (mtbf > maximum)
            {
                currentUnit++;
                mtbf = FailureRateToMTBF(failureRate, (MTBFUnits)currentUnit);
                if ((MTBFUnits)currentUnit == MTBFUnits.INVALID)
                {
                    break;
                }
            }

            if (shortForm)
            {
                output = string.Format("{0:F2}{1}", mtbf,
                                       UnitStringForMTBFUnitShort((MTBFUnits)currentUnit)).ToString();
            }
            else
            {
                output = string.Format("{0:F2}{1}", mtbf,
                                       UnitStringForMTBFUnit((MTBFUnits)currentUnit)).ToString();
            }
        }
        internal static string UnitStringForMTBFUnitShort(MTBFUnits units)
        {
            switch (units)
            {
            case MTBFUnits.SECONDS:
                return("s");

            case MTBFUnits.MINUTES:
                return("m");

            case MTBFUnits.HOURS:
                return("h");

            case MTBFUnits.DAYS:
                return("d");

            case MTBFUnits.YEARS:
                return("y");

            default:
                return("-");
            }
        }
        internal static string UnitStringForMTBFUnit(MTBFUnits units)
        {
            switch (units)
            {
            case MTBFUnits.SECONDS:
                return("seconds");

            case MTBFUnits.MINUTES:
                return("minutes");

            case MTBFUnits.HOURS:
                return("hours");

            case MTBFUnits.DAYS:
                return("days");

            case MTBFUnits.YEARS:
                return("years");

            default:
                return("invalid");
            }
        }