Пользовательский NumberFormatInfo в DataFormatString

У меня есть ASP.NET Gridview с BoundField, привязанным к десятичному значению. Я использую следующий код для форматирования десятичного числа в денежное значение:

DataFormatString="{0:C}"

Однако у нас есть собственная реализация NumberFormatInfo, которая удаляет символ валюты и изменяет разделитель тысяч. Обычно этот формат применяется как таковой:

myDecimal.ToString("C", myCustomNFI);

Как указать пользовательский NumberFormatInfo в элементе BoundField Gridview?

Спасибо


person staterium    schedule 09.07.2009    source источник


Ответы (3)


Это можно сделать с помощью пользовательского связанного поля. Начните с пользовательского класса BoundField. Ниже я попытался следовать вашему соглашению об именах.

namespace CustomBoundField
{
    public class NFIBoundField : System.Web.UI.WebControls.BoundField
    {
        protected override string FormatDataValue(object dataValue, bool encode)
        {
            if (dataValue == null || dataValue == System.DBNull.Value)
                return "";

            if (base.DataFormatString == string.Empty)
                return dataValue.ToString();

            // Format as you wish based on dataValue and DataFormatString argument
            return string.Format("{0}", dataValue);
        }
    }
}

Зарегистрируйте элемент управления в вашем файле .ASPX:

<%@ Register Namespace="CustomBoundField" TagPrefix="custom" %>

Ссылка на пользовательский BoundField внутри вашего GridView:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
    <Columns>
        <custom:NFIBoundField  DataField="Price" HeaderText="Price" DataFormatString="{0:NFI}"/>
    </Columns>
</asp:GridView>

Вы захотите поиграть внутри FormatDataValue(), чтобы получить желаемое форматирование.

Пара комментариев:

  • Если вы хотите, чтобы ваш пользовательский BoundField обрабатывал несколько форматов, проанализируйте base.DataFormatString, чтобы получить тип форматирования. Другими словами, предоставление {0:NFI} или {0:NFI2} в начале кода может привести к различным форматам, если вы приспособите это к FormatDataValue.

  • Возможно, вы захотите рассмотреть возможность создания собственного поставщика формата, а не размещать всю логику форматирования прямо внутри функции FormatDataValue.

Этот подход должен работать для вас просто отлично. Удачи.

person Ben Griswold    schedule 09.07.2009

Попробуйте использовать field.DataFormatString = currencySymbol + "{0:#,###.##}";

Он отлично работает для меня.

person Ramesh.kbvr    schedule 25.05.2011

Я не уверен на 100%, но я не думаю, что вы можете.

Вам нужно будет использовать поле шаблона и выполнить привязку к литералу в RowDataBound вместо использования собственного средства форматирования. Однако рад оказаться неправым....

person Justin Wignall    schedule 09.07.2009
comment
По правде говоря, я уже сделал это, потому что не мог найти другого способа сделать это. Переопределение NumberFormatInfo CurrentCulture должно работать, но оно доступно только для чтения, поэтому я также отказался от этой последовательности. У кого-нибудь еще есть какой-то вклад? - person staterium; 09.07.2009