none
como convertir un textbox a moneda RRS feed

  • Pregunta

  • hola que tal 

    tengo un pequeño problema tengo un textbox el cual necesito que al ir escribiendo el contenido se convierta a tipo moneda 

    ej:

     si escribo "123"

    que aparezca "$123.00"

    o "123.4" que aparezca "$123.40"

    viernes, 3 de agosto de 2012 18:06

Respuestas

  • no recomiendo lo que intentas hacer, porque para aplciar formato requieres un valor numerico

    y encuanto le pongas el signo dejara de ser numero y tendras problemas, si el textbox donde escribes tiene un label al costado con la etiqueta del campo que representa, porque no pones alli la leyenda o sea

    Importe ($)

    con eso ya indicas en que esta representada la moneda, si podrias darle formato decimal eso no hay problema en el evento lostfocus harias

    private void textbox1_lostfocus(...){

        textbox1.Text = Convert.ToDecimal(textbox1.Text).ToString("N2");

    }


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Propuesto como respuesta Juan C. Gómez jueves, 23 de agosto de 2012 23:44
    • Marcado como respuesta Eduardo Calvario viernes, 24 de agosto de 2012 15:31
    sábado, 4 de agosto de 2012 5:05

Todas las respuestas

  • no recomiendo lo que intentas hacer, porque para aplciar formato requieres un valor numerico

    y encuanto le pongas el signo dejara de ser numero y tendras problemas, si el textbox donde escribes tiene un label al costado con la etiqueta del campo que representa, porque no pones alli la leyenda o sea

    Importe ($)

    con eso ya indicas en que esta representada la moneda, si podrias darle formato decimal eso no hay problema en el evento lostfocus harias

    private void textbox1_lostfocus(...){

        textbox1.Text = Convert.ToDecimal(textbox1.Text).ToString("N2");

    }


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Propuesto como respuesta Juan C. Gómez jueves, 23 de agosto de 2012 23:44
    • Marcado como respuesta Eduardo Calvario viernes, 24 de agosto de 2012 15:31
    sábado, 4 de agosto de 2012 5:05
  • Hola Eduardo,

    Yo tuve que hacer lo mismo que vos y me cree un control personalizado para que formatee el texto a un numero entero, decimal, moneda o porcentaje, te comparto el código para que veas si te puede servir y tal vez mejorarlo y asi nos queda algo mejor.

    A mi por el momento me funcionó!

    public class TextoEnNumero: TextBox
        {
            public enum formatoNumero
            {
                Número = 0,
                Moneda = 1,
                Porcentaje = 2
            }
    
            private bool _seleccionado;
    
            formatoNumero _formato = formatoNumero.Número;
            int _cantidadDecimales = 0;
    
            [Category("Appearance")]
            [Description("Cantidad de posiciones decimales.")]
            [DefaultValue(0)]
            public int CantidadDecimales
            {
                get { return _cantidadDecimales; }
                set { _cantidadDecimales = value; }
            }
    
            [Category("Appearance")]
            [Description("Establecer en que formato se va a mostrar el número.")]
            [DefaultValue(formatoNumero.Número)]
            public formatoNumero Formato
            {
                get { return _formato; }
                set { _formato = value; }
            }
    
            protected override void OnLeave(EventArgs e)
            {
                procesarTexto();
    
                base.OnLeave(e);
                _seleccionado = false;
            }
    
            protected override void OnEnter(EventArgs e)
            {
                if (this.Text != "")
                {
                    decimal numero = 0;
    
                    ConvertirEnNumero(this.Text, out numero);
    
                    this.Text = numero.ToString(); 
                }
    
                base.OnEnter(e);
                if (MouseButtons == MouseButtons.None)
                {
                    SelectAll();
                    _seleccionado = true;
                }
            }
    
            protected override void OnMouseUp(MouseEventArgs mevent)
            {
                base.OnMouseUp(mevent);
                if (!_seleccionado)
                {
                    if (SelectionLength == 0)
                        SelectAll();
                    _seleccionado = true;
                }
            }
    
            private void procesarTexto()
            {
                decimal numero = 0;
    
                switch (_formato)
                {
                    case formatoNumero.Número:
                        if (ConvertirEnNumero(this.Text, out numero))
                        {
                            this.Text = numero.ToString("F" + _cantidadDecimales);
                        }
                        else
                        {
                            this.Text = "";
                        }
                        break;
    
                    case formatoNumero.Moneda:
                        if (ConvertirEnNumero(this.Text, out numero))
                        {
                            this.Text = numero.ToString("C" + _cantidadDecimales);
                        }
                        else
                        {
                            this.Text = "";
                        }
                        break;
    
                    case formatoNumero.Porcentaje:
                        if (ConvertirEnNumero(this.Text, out numero))
                        {
                            this.Text = (numero / 100).ToString("P" + _cantidadDecimales);
                        }
                        else
                        {
                            this.Text = "";
                        }
                        break;
                }
            }
    
            private bool ConvertirEnNumero(string pTexto, out decimal resultado)
            {
                resultado = 0;
    
                string texto = pTexto;
    
                int indicePunto = 0;
                indicePunto = texto.LastIndexOf(".") + 1;
                int cantidadPuntos = 0;
                cantidadPuntos = texto.Split('.').Length - 1;
    
                int indiceComa = 0;
                indiceComa = texto.LastIndexOf(",") + 1;
                int cantidadComas = 0;
                cantidadComas = texto.Split(',').Length - 1;
    
                texto = texto.Replace(".", "");
                texto = texto.Replace(",", "");
    
                if (indiceComa > indicePunto)
                {
                    if (indiceComa > 0)
                    {
                        texto = texto.Insert(indiceComa - (cantidadPuntos + cantidadComas), ",");
                    }
                }
                else
                {
                    if (indicePunto > 0)
                    {
                        texto = texto.Insert(indicePunto - (cantidadPuntos + cantidadComas), ",");
                    }
                }
    
                string regExp = @"[^0-9\.,-]";
                texto = System.Text.RegularExpressions.Regex.Replace(texto, regExp, "");
    
                texto = texto.Trim();
    
                if (decimal.TryParse(texto, out resultado))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
    
            public decimal Value
            {
                get
                {
                    decimal numero = 0;
    
                    ConvertirEnNumero(this.Text, out numero);
    
                    return numero;
                }
    
                set
                {
                    this.Text = value.ToString();
    
                    procesarTexto();
                }
            }
        }

    Basicamente lo que hace es:

    En el evento OnLeave, intenta darle formato al número, si falla borra el texto.

    En el evento OnEnter le quita el formato para que te quede el número para editar.

    Para obtener el valor numerico (decimal) hay que usar la propiedad Value.

    Las caracteristicas son las siguientes:

    Se puede seleccionar el formato número, moneda o porcentaje, y la cantidad de decimales (0 para enteros).

    Permite el ingreso de números usando la "," o el "." como separador de decimales, luego lo convierte a "," (eso se puede mejorar para que ponga el separador en base a la cultura)

    Borra todo lo que no sea número, coma, punto o signo negativo.

    Saludos!


    Mauro Luque

    martes, 28 de agosto de 2012 21:59