NumberFormatInfo personalizado en DataFormatString
-
12-09-2019 - |
Pregunta
Tengo un GridView ASP.NET con un BoundField que está enlazado a un valor decimal. Yo uso el siguiente código para formatear el número decimal a un valor de moneda:
DataFormatString="{0:C}"
Tenemos una implementación personalizada de NumberFormatInfo sin embargo, que elimina el símbolo de moneda y modifica el separador de miles. Normalmente, este formato se aplica como tal:
myDecimal.ToString("C", myCustomNFI);
¿Cómo se especifica un NumberFormatInfo personalizado en el elemento BoundField del Gridview?
Gracias
Solución
Esto se puede hacer usando un campo enlazado personalizado. Comenzar con una clase BoundField personalizado. A continuación he tratado de seguir su convención de nombres.
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 el control en su archivo .aspx:
<%@ Register Namespace="CustomBoundField" TagPrefix="custom" %>
Haga referencia a la costumbre BoundField dentro de su GridView:
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false">
<Columns>
<custom:NFIBoundField DataField="Price" HeaderText="Price" DataFormatString="{0:NFI}"/>
</Columns>
</asp:GridView>
Usted va a querer jugar en el interior de FormatDataValue () con el fin de obtener el formato que desee.
Un par de comentarios:
-
Si usted quiere que su costumbre de BoundField manejar múltiples formatos, analizar base.DataFormatString para obtener el tipo de formato. En otras palabras, proporcionando {0: NFI} o {0: NFI2} en el código adelantado podría dar lugar a diferentes formatos si cabida a esto dentro de FormatDataValue.
-
Es posible que desee considerar la creación su propio proveedor de formato en lugar de la colocación de toda la lógica de formateo justo dentro de la FormatDataValue función.
Este enfoque debería funcionar para usted muy bien. Mejor de las suertes.
Otros consejos
Trate con field.DataFormatString = CURRENCYSYMBOL + "{0:. #, ### ##}";
Funciona bien para mí.
No estoy 100% seguro, pero no creo que pueda.
Usted tendrá que utilizar un campo de la plantilla y se unen a un literal en lugar de utilizar su RowDataBound formateador personalizado. Feliz de estar equivocado sin embargo ....