Переопределить десятичный метод toString()

#c# #overriding #decimal #number-formatting

#c# #переопределение #десятичный #форматирование чисел

Вопрос:

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

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

Обновить

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

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

Комментарии:

1. Простой поисковый запрос дал мне это: csharp-examples.net/string-format-double

2. msdn.microsoft.com/en-us/library/fzeeb5cd.aspx

3. Я хочу, чтобы по умолчанию он отображался на всех страницах, например, я хочу <%= item.price %> (где цена равна 18,8 десятичной), чтобы выглядеть так 14.765 14.76500000 , а не вместо того, чтобы переходить везде и менять его на <%= item.price.ToString("#,###,##0.########") %>

4. Это хороший вопрос, похоже, его невозможно выполнить, поскольку никто не ответил на него должным образом

Ответ №1:

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

Комментарии:

1. Не обязательно. Например, если вы используете приобретенное сеточное решение, переопределение toString иногда является единственным вариантом.

2. и что такое купленная сетка? Из OP: » когда я использую ответ. Напишите, чтобы вернуть его значение на веб-страницу»

3. А, понятно. Это не связано с OP, если он использует только using Response . Запись.

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

5. Как упоминали другие, вы не можете переопределить, поскольку Decimal — это структура. Похоже, вы можете захотеть внести изменения в дизайн здесь. Как минимум, определите строку вашего формата в файле констант. Например, мы отображаем дату и время как обычный DTG (группа даты и времени). У меня есть строка, определенная в файле consts, и эта постоянная строка может быть передана методу toString() или спецификатору формата для DataGrid.

Ответ №2:

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

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

 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);
  

Комментарии:

1. Спасибо: (Я сделал это именно так, просто надеялся, что есть способ переопределить toString() по умолчанию

2. Ни в коем случае, вы не можете сделать это для структур.

Ответ №3:

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

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

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

Это создает фасад перед 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();
  

Ответ №4:

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

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

Комментарии:

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