Переопределить десятичный метод ToString () - PullRequest
4 голосов
/ 04 октября 2011

У меня есть десятичный тип данных с точностью (18, 8) в моей базе данных, и даже если его значение просто 14.765, оно все равно будет отображаться как 14.76500000, когда я использую Response.Write, чтобы вернуть его значение на веб-страницу.

Можно ли переопределить метод ToString по умолчанию, чтобы вернуть число в формате #,###,##0.########, чтобы оно отображало только соответствующие десятичные разряды?

UPDATE

Я предполагаю, что когда на странице выводится число типа <%= item.price %> (где item.price - число), то вызывается метод ToString этого числа?

Я пытаюсь избежать необходимости менять каждый экземпляр, в котором отображается значение, как-то по умолчанию в формате ToString ().

Ответы [ 4 ]

6 голосов
/ 04 октября 2011

Вы не хотите переопределять ToString(), хотите позвонить ToString() и указать строку форматирования IFormatProvider или

3 голосов
/ 04 октября 2011

Вы не можете переопределить ToString для десятичного типа, так как это struct .

Но вы можете использовать методы расширения для этого:

public static class DecimalExtensions
{
      public static string ToString(this decimal some, bool compactFormat)
      {
            if(compactFormat) 
            {
                return some.ToString("#,###,##0.########");
            }
            else
            {
                return some.ToString();
            }
      }
}

Так что теперь вы можете сделать это:

string compactedDecimalText = 16.38393m.ToString(true);
2 голосов
/ 18 ноября 2011

Я столкнулся с той же проблемой, что и вы. Люди хотели, чтобы по всему приложению форматировались десятичные знаки сумасшедшим образом.

Моей первой идеей было создать обертку вокруг Decimal и переопределить метод ToString ().

Хотя вы не можете наследовать от десятичного числа, вы можете создать тип, который неявно преобразуется в десятичное число и обратно.

Это создает фасад перед Decimal и дает вам возможность написать собственную логику форматирования.

Ниже мое возможное решение, дайте мне знать, если это работает или это ужасная идея.

public struct Recimal
{

    private decimal _val;
    public Recimal(decimal d) { _val = d; }

    public static implicit operator Recimal(decimal d)
    {
        return new Recimal(d);
    }

    public static implicit operator Decimal(Recimal d)
    {
        return d._val;
    }

    public override string ToString()
    {
        //if negative, show the minus sign to the right of the number
        if (_val < 0)
            return String.Format("{0:0.00;0.00-;}", _val);

        return _val.ToString();
    }

}

Он работает как десятичное число:

        Decimal d = 5;
        Recimal r = -10M;
        Recimal result = r + d;

        //result: 5.00-
        textBox1.Text = result.ToString();
0 голосов
/ 04 октября 2011

Почему бы не использовать string.Format() непосредственно на double?

Вот некоторые ссылки для параметров форматирования:

...