#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() по умолчанию.