Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: metalost en 1 Julio 2016, 22:17 pm



Título: c# Ayuda codigo posible error FLOAT
Publicado por: metalost en 1 Julio 2016, 22:17 pm
Buenas estoy empezando a aprender c# estaba con un projecto en el visual estudio de "Console aplication"

Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Pag_9_repasando
  8. {
  9.    class Program
  10.    {
  11.        static void Main(string[] args)
  12.        {
  13.            int n, x, sirven;
  14.            float longitud;
  15.            string linea;
  16.            x = 1;
  17.            sirven = 0;
  18.            Console.Write("Ingrese numero de piezas: ");
  19.            linea = Console.ReadLine();
  20.            n = int.Parse(linea);
  21.  
  22.            while (x <= n)
  23.            {
  24.                Console.WriteLine("Ingrese longitud de la pieza");
  25.                linea = Console.ReadLine();
  26.                longitud = float.Parse(linea);
  27.                if (longitud >= 1.20 && longitud <= 1.30)
  28.                {
  29.                    sirven = sirven + 1;
  30.                }
  31.                x = x + 1;
  32.            }
  33.            Console.Write("El numero total de piezas aptas es de: ");
  34.            Console.WriteLine(sirven);
  35.            Console.ReadKey();
  36.        }
  37.    }
  38. }

Necesito ayuda, el programa no me lee el 1.20 cuando lo ejecuto, si en vez de 1.20 y 1.30 colocara valores enteros como 1 y 2 entonces el programa si funciona pero, es como si no me leyera los numeros decimales, me podrian ayudar?

gracias


Título: Re: c# Ayuda codigo posible error FLOAT
Publicado por: Eleкtro en 1 Julio 2016, 23:13 pm
Hola.

Antes de nada:
1. Utiliza la etiqueta GeShi para formatear el código. Esto es un foro de programación.
2. Lee las normas del foro de programación.
3. Las preguntas de C# van en el subforo de .NET.



En el idioma Español, se utiliza una coma "," como separador de deciales, no un punto. Esto es importante mencionarlo por que los algoritmos de parsing de formatos de .NET Framework usan las reglas del idioma/cultura actual de la aplicación, y en una aplicación .NET el idioma o cultura por defecto es la misma que la que tenga tu sistema (donde desarrolles la app), es decir, será el idioma Español (es-ES)

Entonces, este bloque de órdenes jamás podrá funcionar como esperas, por que tú estás utilizando el separador de decimales que corresponde al idioma Inglés de EEUU (en-US):
Código
  1. linea = Console.ReadLine();
  2. longitud = float.Parse(linea);
  3. if (longitud >= 1.20 && ...

Así que cuando parseas un número como 1.25, ese número se convierte en un entero, osea que el valor que se le asignará a la variable "longitud" será 125,0.

La solución es simple: utiliza la coma para separar decimales como todo el mundo, o bien cambia la cultura de la aplicación a Inglés.

Puedes cambiar la cultura en las propiedades de tu proyecto, o bien en tiempo de ejecución:
Código
  1. CultureInfo.DefaultThreadCurrentCulture = CultureInfo.GetCultureInfo("en-US");

O también puedes utilizar el overload de la función float.Parse() que toma un parámetro que derive de la interfáz IFormatProvider, el cual sirve para especificar con que formato queremos que se parsee el string:
Código
  1. linea = Console.ReadLine(); // 1.25
  2. longitud = float.Parse(line, NumberStyles.Float, new CultureInfo("en-US").NumberFormat);
  3.  
  4. if ((longitud >= 1.2f) && (longitud <= 1.3f)) {
  5. sirven += 1;
  6. }

Saludos.


Título: Re: c# Ayuda codigo posible error FLOAT
Publicado por: metalost en 1 Julio 2016, 23:23 pm
Muchas gracias no sabia, gracias por la ayuda

Estoy intentando las soluciones que dejaste

efectivamente tenia bien escrito el 1.20 en el código pero a la hora de ejecutarlo tenia que colocar 1,20 como todos lo hacen, muchas gracias por la ayuda  :D :D :D