none
Convertir string en double RRS feed

  • Pregunta

  • Hola,

    Tengo un texbox donde el usuario introduce un valor (numerico con punto) por ejemplo 45.4587, esto seria 45 grados 45 minutos 87 segundos. Con este valor debo de realizar operaciones matematicas, asi que lo quiero convertir a double y pongo esto:

    Paso los datos al método transformación que esta en la clase Transformacion (mi dato en concreto es el que va en label1.txt)

    Transformacion trans=new Transformacion();
    double resultransX = trans.transformacion(label1.Text, label2.Text, label3.Text, label4.Text);

    Paso el valor

     public double transformacion(string latitud, string longitud, string oriNS, string oriEO)
            {
                //Convierto los string en double para poder operar.
                double GradosDecimalesLatitud = Convert.ToDouble(latitud);

    ME dice no se encontro FormatException

    La cadena de entrada no tiene el formato correcto.

    ¿Qué ocurre?

    lunes, 28 de mayo de 2012 10:26

Respuestas

  • La verdad es que vaya cosas más raras que te pasan. A ver, supongo que ya lo haces, pero yo lo que haría sería pasar TODO lo que necesitas a double, y luego operar con esos valores double como se ha hecho toda la vida de dios.

    El único "problema" que veo que tienes es con la conversión a double, pues yo cogería una variable de prueba (string) a la que le pasaría un valor de prueba y la convertiría a double.

    Como valores de prueba pasaría 1,25 y miraría si lo convierte bien, depués, 1.25 y lo mismo.

    ¿que te convierte bien a double 1,25? Pues coges todos los string y le cambias los posibles puntos por comas (que supongo que sólo tendrá uno). Y cuando ya tienes el string con comas lo conviertes a double y con eso trabajas.

    ¿que te convierte bien a double 1.25? Pues como antes, quitas las comas y pones puntos en los string, conviertes todo a double y con eso trabajas.

    • Marcado como respuesta cutuche martes, 29 de mayo de 2012 10:48
    martes, 29 de mayo de 2012 10:43

Todas las respuestas

  • hola

    cual es la cultura que usas en tu aplicacion ?

    porque si es en-US entonces el punto es un separador de decimales, pero si es es-ES entonces el punto es un separador de miles

    esto influye mucho al momento de convertir de un tipo a otro

    quizas en el main() de programs.cs debeas poner esta linea

    Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");

    para definir que cultura vas a usar

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    lunes, 28 de mayo de 2012 12:05
  • Hola Leandro,

    He colocado

    Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");

    Pero me dice que: El nombre Thread no existe en el contexto actual.

    Así lo tengo. Trabajo con Visual C# 2010 Express

    static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
                Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
                
            }

    lunes, 28 de mayo de 2012 12:56
  • Hola cutuche1.

    Tendrás que añadir la referencia al espacio de nombres System.Threading en la cabecera del código de tu formulario, es decir, donde están el resto de using

    using System.Threading;


    "En los momentos de crisis, sólo la imaginación es más importante que el conocimiento"

    lunes, 28 de mayo de 2012 15:09
  • Ok ya me "entiende" el Threading,

    Pero me sigue dando el mismo problema

    Repito lo anterior.

    Paso los datos al método transformación que esta en la clase Transformacion (mi dato en concreto es el que va en label1.txt)

    Transformacion trans=new Transformacion();
    double resultransX = trans.transformacion(label1.Text, label2.Text, label3.Text, label4.Text);

    Paso el valor

     public double transformacion(string latitud, string longitud, string oriNS, string oriEO)
            {
                //Convierto los string en double para poder operar.
                double GradosDecimalesLatitud = Convert.ToDouble(latitud);

    ME dice no se encontro FormatException

    La cadena de entrada no tiene el formato correcto.

    ¿Qué ocurre?

    lunes, 28 de mayo de 2012 16:25
  • ¿por que no pruebas a hacer la conversión directamente sobre los datos originales en lugar de con una función? Así podemos ir descartando cosas y vemos si es problema de los datos o problema de la función que has creado.

    Un saludo.

    • Marcado como respuesta cutuche martes, 29 de mayo de 2012 9:27
    • Desmarcado como respuesta cutuche martes, 29 de mayo de 2012 10:12
    martes, 29 de mayo de 2012 6:16
  • Hola cutuche.

    ¿qué cultura estás estableciendo y qué valor estás intentando convertir?


    "En los momentos de crisis, sólo la imaginación es más importante que el conocimiento"

    martes, 29 de mayo de 2012 7:26
  • Hola.

    Casi solucione el problema:

    La cultura elegida: Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");

    Y he utilizado PArse, así:

    double lat;
            double lon;
            string N;
            string E;
            private void button1_Click(object sender, EventArgs e)
            {

                lat = double.Parse(textBox1.Text);
                lon = double.Parse(textBox3.Text);
                N = textBox3.Text;
                E = textBox4.Text;
                Transformacion trans=new Transformacion();
                double resultransX = trans.transformacion(lat,lon,N,E);

    Al meter 2 numeros con decimales (. como separacion de decimales), no tiene en cuenta el punto para separar decimales. Así si meto 2.34 y lo sumo a 3.54 me da de resultado 588, cuando debería ser 5.88.

    ¿Que puede pasar?

    • Editado cutuche martes, 29 de mayo de 2012 10:20
    martes, 29 de mayo de 2012 9:34
  • La verdad es que vaya cosas más raras que te pasan. A ver, supongo que ya lo haces, pero yo lo que haría sería pasar TODO lo que necesitas a double, y luego operar con esos valores double como se ha hecho toda la vida de dios.

    El único "problema" que veo que tienes es con la conversión a double, pues yo cogería una variable de prueba (string) a la que le pasaría un valor de prueba y la convertiría a double.

    Como valores de prueba pasaría 1,25 y miraría si lo convierte bien, depués, 1.25 y lo mismo.

    ¿que te convierte bien a double 1,25? Pues coges todos los string y le cambias los posibles puntos por comas (que supongo que sólo tendrá uno). Y cuando ya tienes el string con comas lo conviertes a double y con eso trabajas.

    ¿que te convierte bien a double 1.25? Pues como antes, quitas las comas y pones puntos en los string, conviertes todo a double y con eso trabajas.

    • Marcado como respuesta cutuche martes, 29 de mayo de 2012 10:48
    martes, 29 de mayo de 2012 10:43
  • OK,

    Cambie todo a , y funciona bien.

    Gracias

    martes, 29 de mayo de 2012 10:48
  • No estoy muy de acuerdo con la solución escogida y te ponga otra alternativa:

                NumberFormatInfo nfp = new CultureInfo("en-US", false).NumberFormat;
                double val1 = 0;
                double val2 = 0;
                if (!double.TryParse(textBox1.Text, NumberStyles.AllowDecimalPoint, nfp, out val1))
                    return;
                if (!double.TryParse(textBox2.Text, NumberStyles.AllowDecimalPoint, nfp, out val2))
                    return;
               
    

    Y comprueba el valor de la suma de val1+val2 =D

    Saludos


    Javier Torrecilla
    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi Blog: Jtorrecilla
    Enlace a Faq de Winforms en Ingles Muy bueno
    TabControl con Mejoras

    martes, 29 de mayo de 2012 10:52
    Moderador
  • No estoy muy de acuerdo con la solución escogida y te ponga otra alternativa:

                NumberFormatInfo nfp = new CultureInfo("en-US", false).NumberFormat;
                double val1 = 0;
                double val2 = 0;
                if (!double.TryParse(textBox1.Text, NumberStyles.AllowDecimalPoint, nfp, out val1))
                    return;
                if (!double.TryParse(textBox2.Text, NumberStyles.AllowDecimalPoint, nfp, out val2))
                    return;
               

    una preguntilla (y así aprendo :D), quitando lo que devuelve la función y demás, en cuanto a efectos prácticos ¿qué mejora o ventaja consigue eso comentas frente a hacer esto?

    //suponiendo que se tienen dos string como entrada
    
    valor_entrada1 = valor_entrada1.Replace('.', ','); 
    valor_entrada2 = valor_entrada2.Replace('.', ','); 
    double resultado = Convert.ToDouble(valor_entrada1) + Convert.ToDouble(valor_entrada2)

    un saludo




    • Editado fjbgcmbsgr martes, 29 de mayo de 2012 11:09
    martes, 29 de mayo de 2012 11:07
  • Hola fjbgcmbsgr

    Imagina un número válido con cultura española: 1.000.523,25. Al hacer la transformación obtendrías: 1,000,523,25

    ¿Cual sería el problema que tendrías?

    Al indicar la cultura y el formato númerico de dicha cultura, cuando realices la conversión vas a saber lo que puede o no puede contener la cadena.

    Saludos


    Javier Torrecilla
    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi Blog: Jtorrecilla
    Enlace a Faq de Winforms en Ingles Muy bueno
    TabControl con Mejoras

    martes, 29 de mayo de 2012 11:18
    Moderador
  • vale, cierto es. Es que como yo en la aplicación que tengo o trabajo con numeriupdown para cifras (ahi ya no hay problema) o leo valores de la base de datos (donde restringo al guardar y directamente nunca se me va a dar el caso que comentas (sólo guardo decimales, pero no separadores)), pues ni había caido en la posibilidad de que pasara eso que comentas.

    Un saludo y muchas gracias por la aclaración :)


    • Editado fjbgcmbsgr martes, 29 de mayo de 2012 11:25
    martes, 29 de mayo de 2012 11:24
  • No estoy muy de acuerdo con la solución escogida y te ponga otra alternativa:

                NumberFormatInfo nfp = new CultureInfo("en-US", false).NumberFormat;
                double val1 = 0;
                double val2 = 0;
                if (!double.TryParse(textBox1.Text, NumberStyles.AllowDecimalPoint, nfp, out val1))
                    return;
                if (!double.TryParse(textBox2.Text, NumberStyles.AllowDecimalPoint, nfp, out val2))
                    return;
               

    una preguntilla (y así aprendo :D), quitando lo que devuelve la función y demás, en cuanto a efectos prácticos ¿qué mejora o ventaja consigue eso comentas frente a hacer esto?

    //suponiendo que se tienen dos string como entrada
    
    valor_entrada1 = valor_entrada1.Replace('.', ','); 
    valor_entrada2 = valor_entrada2.Replace('.', ','); 
    double resultado = Convert.ToDouble(valor_entrada1) + Convert.ToDouble(valor_entrada2)

    un saludo




    Con tu ejemplo pude solucionar un problema que me tenia agobiado, trabajando en xamarin forms. Me registre solo para comentar y agradecer tu ayuda. Seco! 
    martes, 14 de enero de 2020 20:31