none
decimales c# RRS feed

  • Pregunta

  • Buenas noches.

    Ando calculando el IVA de un producto, pero al parecer cuando realizo la multiplicación en base a decimales, no sale correctamente

               

    decimal prec = decimal.Parse(precio.Text);
                decimal iva = 0.16m;
               decimal prec_total = prec*iva;
                precio_con_iva.Text = prec_total.ToString();

    se supone que el resultado con el IVA debería ser 7.12, no me recorre la coma. 

    domingo, 2 de diciembre de 2018 4:45

Respuestas

  • De todas formas, me he fijado en la imagen y el separador de decimales en los textboxes son diferentes. En el precio usas un punto y en el precio con iva una coma. Te recomiendo establezca la cultura deseada al inicio de tu aplicación. Para ello debes hacer

    System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("es-ES");


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    domingo, 2 de diciembre de 2018 11:47
    Moderador

Todas las respuestas

  • Hola Murillo Lilia:

    El problema no esta en el cálculo, sino en la entrada

    decimal prec=decimal.Parse(precio.Text);

    no tiene 44.50 sino 4450

    domingo, 2 de diciembre de 2018 9:08
  • Buenas,

    Entiendo que el resultado con IVA tiene que ser 44,5 + 7,12, no solo 7,12. Eso seria el IVA solo, eso seria algo asi:

    decimal prec = decimal.Parse(precio.Text);
    decimal iva = 0.16m;
    decimal prec_total = (prec*iva)+prec;
    precio_con_iva.Text = prec_total.ToString();


    Por otro lado, el problema que tu tienes, como bien dice el compañero Javi Fernandez, es que estas utilizando punto "." y en vez de coma "," y tu configuración regional seguramente diga que el separador de decimales es la coma.

    Para encarar esto tienes dos opciones, asumir que tus usuarios van a usar siempre una configuración regional y bloquear el otro símbolo, o tu internamente convertirlo antes de parsear. Para esa segunda opción, podrías haces algo como esto:

    using System;
    using System.Threading;
    
    namespace MSDN
    {
        class Program
        {
            static void Main(string[] args)
            {
                string strSeparadorDecimal = Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyDecimalSeparator;
                string strEjemploPunto = "120.00";
                string strEjemploComa = "120,00";
    
                decimal lfPunto, lfComa;
                decimal.TryParse(strEjemploPunto.Replace(".", strSeparadorDecimal).Replace(",", strSeparadorDecimal), out lfPunto);
                decimal.TryParse(strEjemploComa.Replace(".", strSeparadorDecimal).Replace(",", strSeparadorDecimal), out lfComa);
    
                Console.WriteLine($"La entrada con punto y la entrada con coma son iguales = {lfComa ==lfPunto}");
    
                Console.Read();
            }
        }
    }

    Como ves, obtienes la configuración regional de el pc que ejecuta tu programa, y reemplazas los dos símbolos (por si acaso, aunque se podría hacer un if y hacer solo un replace en función de si hay que quitar punto o coma) por el símbolo de separador decimal, con eso, funciona bien independiente de que introduzcan puntos o comas.

    Si tienes dudas nos comentas

    Atte


    Jorge Turrado Ferrero

    Mis repositorios en GitHub

    Mi Blog


    Ranking GitHub Euskadi
    Ranking GitHub Alava

    No olvides votar mi comentario si te ha ayudado y marcarlo como respuesta si ha sido la solución, con eso ayudas a mejorar mi reputación en la comunidad y a identificar la respuesta a la gente que tenga el mismo problema.

    domingo, 2 de diciembre de 2018 11:40
  • Hola. El problema lo tienes en el parseo del contenido del textbox. Lo que debes aplicar es globalizacion para poder hacerlo de forma correcta

    CultureInfo culture = new CultureInfo("es-ES");
    
    decimal prec = decimal.Parse(precio.Text, culture);
    
    


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    domingo, 2 de diciembre de 2018 11:43
    Moderador
  • De todas formas, me he fijado en la imagen y el separador de decimales en los textboxes son diferentes. En el precio usas un punto y en el precio con iva una coma. Te recomiendo establezca la cultura deseada al inicio de tu aplicación. Para ello debes hacer

    System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("es-ES");


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    domingo, 2 de diciembre de 2018 11:47
    Moderador