none
Problema de formateo decimales en un datagridview RRS feed

  • Pregunta

  • Hola a todos,

    Me ocurre lo siguiente. Quiero que tanto las columnas "unidades" como la de "precio" de un datagridview acepte el punto com el separador decimal, y leyendo la documentación de microsoft lo he hecho de la siguiente manera:

    DataGridViewColumn col = this.customDataGridView1.Columns[UNIDADES];
    col.DefaultCellStyle.Format = "N2";
    Pero sigue sin aceptar el punto como separador decimal. Es decir si informo la celda con 12.40 me lo convierte a 1240,00.
    He verificado el CultureInfo y lo tengo a "es-ES".

    Grácias de antemano.

    Albert Gassó
    Ingeniero Técnico en Informática
    sábado, 19 de diciembre de 2009 12:37

Respuestas

  • hola

    ahi esta el problema es que en la cultura es-Es el punto no es el separador de decimales, lo es la coma
    o sea esta llendo en contra a la cultura que estas utilizando en la aplicacion

    por eso te aconsejo que si quieres dejar fija la cultura, o sea seguir usando es-ES, entonces has que se muestre una coma como separador de decimales 12,40

    sino deberas cambiar la cultura de la apliciacion a en-US

    o una ultima alternativa que puede probar es la de usar el evento CellFormating de la grilla para establecer el valor de la celda usando el Convert.ToString() especificando la cultura en-US

    e.Value = Convert.ToString(e.Value, new System.Globalization.CultureInfo("en-US"))

    por ahi funciona, la verdad nunca lo he probado, ya que el N2 en la defincion de la columna toma la cultura definida en la aplicacion


    - otro punto a tener en cuenta es que si tus datos viene con punto al convertir definas la cultura que se este usando

    Convert. ToString Method


    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta Albert Gassó lunes, 21 de diciembre de 2009 12:45
    domingo, 20 de diciembre de 2009 1:18
  • "Albert Gassó" escribió:

    > Quiero que tanto las columnas "unidades" como la de "precio" de un datagridview
    > acepte el punto com el separador decimal,
    >
    > He verificado el CultureInfo y lo tengo a "es-ES".

    Hola, Albert:

    Lo que pretendes hacer va en contra de los buenos principios de la programación, que simplemente tratan de que tu aplicación SE TIENE QUE ADAPTAR A LAS PREFERENCIAS DEL USUARIO, pero no que el usuario se adapte a tu aplicación.

    Si el usuario tiene establecida en su sistema operativo una configuración regional de Español, tu aplicación tiene que trabajar con dicha configuración regional, y si tiene una configuración de Chino Tradicional, pues esa será la que tendrá que utilizar tu aplicación, pero no imponerle una configuración regional concreta.

    De todas maneras, si deseas imponerle al usuario el punto como separador decimal, establece un objeto CultureInfo de inglés americano a la propiedad CurrentCulture del objeto Application, por ejemplo, en el procedimiento Main de tu aplicación:

            /// <summary>
            /// Punto de entrada principal para la aplicación.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);

                // No se recomienda imponerle al usuario una cultura distinta
                // a la que tiene establecida en su sistema operativo.
                //
                Application.CurrentCulture = new System.Globalization.CultureInfo("en-US");

                Application.Run(new Form1());
            }

    Un saludo y ¡Feliz Navidad!


    Enrique Martínez [MS MVP - VB]
    • Propuesto como respuesta Enrique M. Montejo domingo, 20 de diciembre de 2009 8:26
    • Marcado como respuesta Albert Gassó lunes, 21 de diciembre de 2009 12:45
    domingo, 20 de diciembre de 2009 8:25

Todas las respuestas

  • hola

    ahi esta el problema es que en la cultura es-Es el punto no es el separador de decimales, lo es la coma
    o sea esta llendo en contra a la cultura que estas utilizando en la aplicacion

    por eso te aconsejo que si quieres dejar fija la cultura, o sea seguir usando es-ES, entonces has que se muestre una coma como separador de decimales 12,40

    sino deberas cambiar la cultura de la apliciacion a en-US

    o una ultima alternativa que puede probar es la de usar el evento CellFormating de la grilla para establecer el valor de la celda usando el Convert.ToString() especificando la cultura en-US

    e.Value = Convert.ToString(e.Value, new System.Globalization.CultureInfo("en-US"))

    por ahi funciona, la verdad nunca lo he probado, ya que el N2 en la defincion de la columna toma la cultura definida en la aplicacion


    - otro punto a tener en cuenta es que si tus datos viene con punto al convertir definas la cultura que se este usando

    Convert. ToString Method


    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta Albert Gassó lunes, 21 de diciembre de 2009 12:45
    domingo, 20 de diciembre de 2009 1:18
  • "Albert Gassó" escribió:

    > Quiero que tanto las columnas "unidades" como la de "precio" de un datagridview
    > acepte el punto com el separador decimal,
    >
    > He verificado el CultureInfo y lo tengo a "es-ES".

    Hola, Albert:

    Lo que pretendes hacer va en contra de los buenos principios de la programación, que simplemente tratan de que tu aplicación SE TIENE QUE ADAPTAR A LAS PREFERENCIAS DEL USUARIO, pero no que el usuario se adapte a tu aplicación.

    Si el usuario tiene establecida en su sistema operativo una configuración regional de Español, tu aplicación tiene que trabajar con dicha configuración regional, y si tiene una configuración de Chino Tradicional, pues esa será la que tendrá que utilizar tu aplicación, pero no imponerle una configuración regional concreta.

    De todas maneras, si deseas imponerle al usuario el punto como separador decimal, establece un objeto CultureInfo de inglés americano a la propiedad CurrentCulture del objeto Application, por ejemplo, en el procedimiento Main de tu aplicación:

            /// <summary>
            /// Punto de entrada principal para la aplicación.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);

                // No se recomienda imponerle al usuario una cultura distinta
                // a la que tiene establecida en su sistema operativo.
                //
                Application.CurrentCulture = new System.Globalization.CultureInfo("en-US");

                Application.Run(new Form1());
            }

    Un saludo y ¡Feliz Navidad!


    Enrique Martínez [MS MVP - VB]
    • Propuesto como respuesta Enrique M. Montejo domingo, 20 de diciembre de 2009 8:26
    • Marcado como respuesta Albert Gassó lunes, 21 de diciembre de 2009 12:45
    domingo, 20 de diciembre de 2009 8:25
  • Efectívamente Enrique, el forzar el CultureInfo va en contra de los buenos principios de la programación y de hecho no lo estoy forzando, sinó que como desconocia de donde podia provenir el posible error, lo que hice fué comprobar que contenia mi CultureInfo, pensando que este no era el responsable de tal característica.

    Grácias a los dos.

    Saludos.
    Albert Gassó
    Ingeniero Técnico en Informática
    lunes, 21 de diciembre de 2009 12:49
  • hola

    ahi esta el problema es que en la cultura es-Es el punto no es el separador de decimales, lo es la coma
    o sea esta llendo en contra a la cultura que estas utilizando en la aplicacion

    por eso te aconsejo que si quieres dejar fija la cultura, o sea seguir usando es-ES, entonces has que se muestre una coma como separador de decimales 12,40

    sino deberas cambiar la cultura de la apliciacion a en-US

    o una ultima alternativa que puede probar es la de usar el evento CellFormating de la grilla para establecer el valor de la celda usando el Convert.ToString() especificando la cultura en-US

    e.Value = Convert.ToString(e.Value, new System.Globalization.CultureInfo("en-US"))

    por ahi funciona, la verdad nunca lo he probado, ya que el N2 en la defincion de la columna toma la cultura definida en la aplicacion


    - otro punto a tener en cuenta es que si tus datos viene con punto al convertir definas la cultura que se este usando

    Convert. ToString Method


    saludos
    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    Hola Leandro,

    También tengo el mismo problema de Albert, y siguiendo tu consejo he utilizado el evento cellFormating. Cuando cargo los datos en la columna de tipo System.Decimal me carga los valores decimales con su punto correctamente.

    El problema viene cuando inserto un nuevo registro, al ser una columna de tipo System.Decimal, al poner un valor decimal (34.89) me lo formatea rápidamente a 3489, he intentado controlar esto a través del evento CellValidating pero no hay manera.

    Pienso que tiene que haber una manera de poder establecer la cultura en-US a una columna en concreto, a través de una propiedad o algo parecido, pero no soy capaz de encontrarla.

    De todos modos seguiré buscando, muchas gracias por todo de antemano!!!

    Patricia

    martes, 20 de abril de 2010 9:46