NumberFormatInfo personalizado em DataFormatString
-
12-09-2019 - |
Pergunta
Eu tenho um GridView ASP.NET com um BoundField que está vinculado a um valor decimal. Eu uso o seguinte código para formatar o número decimal para um valor de moeda:
DataFormatString="{0:C}"
Temos uma implementação personalizada do NumberFormatInfo porém, que remove o símbolo da moeda e modifica a milhares seperator. Normalmente, este formato é aplicado como tal:
myDecimal.ToString("C", myCustomNFI);
Como posso especificar um costume NumberFormatInfo no elemento BoundField do Gridview?
Graças
Solução
Isto pode ser feito usando um campo ligados personalizado. Comece com um costume classe BoundField. Abaixo eu tentou seguir sua convenção de nomenclatura.
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);
}
}
}
registrar o controle em seu arquivo ASPX:
<%@ Register Namespace="CustomBoundField" TagPrefix="custom" %>
Referência BoundField personalizado dentro do seu GridView:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
<Columns>
<custom:NFIBoundField DataField="Price" HeaderText="Price" DataFormatString="{0:NFI}"/>
</Columns>
</asp:GridView>
Você vai querer brincar dentro de FormatDataValue () a fim de obter a formatação desejada.
Um par de comentários:
-
Se você quiser que o seu costume BoundField para lidar com vários formatos, parse base.DataFormatString para obter o formatação tipo. Em outras palavras, fornecendo {0: NFI} ou {0: NFI2} no code-frente pode resultar em diferentes formatos se acomodar para isso dentro FormatDataValue.
-
Você pode querer considerar a criação de o seu próprio provedor de formato em vez de colocando toda a sua lógica formatação dentro direita do FormatDataValue função.
Esta abordagem deve trabalhar para você muito bem. Melhor da sorte.
Outras dicas
Tente com field.DataFormatString = currencySymbol + "{0:. #, ### ##}";
Ele funciona muito bem para mim.
Eu não estou 100% certo, mas eu não acho que você pode.
Você vai precisar usar um campo de modelo e se ligam a um literal em RowDataBound em vez de usar o formatador personalizado. Feliz por estar errado no entanto ....