Двойное форматирование для отображения только 4 цифр - PullRequest
1 голос
/ 13 февраля 2012

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

Например, если пользователь хочет всегда видеть 4 цифры, возьмите в качестве примера следующие числа:

Original             Formatted
-------             ---------
3.42421             3.424
265.6250            265.6
812.50              812.5
12.68798            12.68
0.68787             0.687

Я придумал это, но это просто учитывает число с плавающей точкой!это не то, что я хотел!

    public string ToEngV(double d, int percision = 0)
    {
        string zeros = string.Empty;

        if (percision <= 0)
        {
                zeros += "0";
        }
        else if (percision > 0)
        {
            for (int i = 0; i < percision; i++)
            {
                zeros += "0";
            }
        }

       return String.Format("{0:0." + zeros + "}", d) 
     }

Представьте, что я вызываю вышеуказанный метод для числа, такого как 812.50, и я установил точность (теперь она используется для всех чисел, которые я собираюсь отформатировать).Очевидно, что результат будет 812.5

Но если я дам другое число, например 1.61826, я получу 1.6, и это разрушит форматирование на странице, где я показываю это число пользователям.Мне нужно, чтобы это было 1.618

Таким образом, я хочу, чтобы мой метод всегда показывал N цифру!

Ответы [ 5 ]

2 голосов
/ 13 февраля 2012

Я не уверен, что вы просите округлить или усечь числа, поэтому я написал этот метод:

public static string ToEngV(this double d, int digits, bool round)
{
    var lenght = Math.Truncate(d).ToString().Length;

    if (lenght > digits)
    {
        throw new ArgumentException("...");
    }

    int decimals = digits - lenght;

    if (round)
    {
        return Math.Round(d, decimals).ToString();
    }
    else
    {
        int pow = (int)Math.Pow(10, decimals);
        return (Math.Truncate(d * pow) / pow).ToString();
    }
}

Пример:

var numbers = new double[] { 3.42421, 265.6250, 812.50, 12.68798, 0.68787 };
foreach (var number in numbers)
{
    Console.WriteLine(number.ToEngV(4, false));
}
Console.WriteLine()
foreach (var number in numbers)
{
    Console.WriteLine(number.ToEngV(4, true));
}

Выход:

3.424
265.6
812.5
12.68
0.687

3.424
265.6
812.5
12.69
0.688

Обратите внимание, что если ваш номер содержит больше целых цифр, чем digits, вы получите ArgumentException.

1 голос
/ 13 февраля 2012
number.ToString("#0.000").Substring(0, 5);
1 голос
/ 13 февраля 2012

Как насчет чего-то вроде:

d.ToString().PadRigth(4,'0').SubString(0,4);
1 голос
/ 13 февраля 2012

Я не уверен, что это то, что вы ищете, в любом случае, попробуйте:

    string FmtDbl(double num, int digits)
    {
        digits++; // To include decimal separator
        string ret = num.ToString();
        if (ret.Length > digits) return ret.Substring(0, digits);
        else return ret + new String('0', digits - ret.Length);
    }

Обратите внимание, что если ваш номер содержит более цифр целых цифр,это не работает ...

0 голосов
/ 13 февраля 2012
public static void RunSnippet()
    {

        Console.WriteLine(myCustomFormatter(3.42421));
        Console.WriteLine(myCustomFormatter(265.6250));
        Console.WriteLine(myCustomFormatter(812.50));
        Console.WriteLine(myCustomFormatter(12.68798));
        Console.WriteLine(myCustomFormatter(0.68787));
        Console.ReadLine();

    }

    public static double myCustomFormatter(double value)
    {
        string sValue = value.ToString();
        string sFormattedValue = sValue.Substring(0,5);
        double dFormattedValue= Convert.ToDouble(sFormattedValue);
        return dFormattedValue;
    }
...