Test Foro de elhacker.net SMF 2.1

Programación => Programación General => Java => Mensaje iniciado por: JonaLamper en 21 Enero 2019, 19:56 PM

Título: Error al leer double de fichero [HELP]
Publicado por: JonaLamper en 21 Enero 2019, 19:56 PM
Buenas tardes!

A ver... tengo un código muy fácil que no sé por qué demonios no funciona  :xD Estoy tratando de leer un double desde fichero así:

Código (java) [Seleccionar]
@Override
public double readDouble(Scanner in) {
return in.nextDouble();
}

double element = readDouble(in);


Y en el fichero tengo el siguiente número escrito: 48.46372902270499. Si asigno ese número directamente a la variable element, entonces sí lo procesa, o sea que debe haber algún tipo de fallo en la lectura, pero no sé cuál  :-\  El Scanner in está simplemente declarado así:

Código (java) [Seleccionar]
Scanner in;

Somebody help me :(

P.D: la excepción lanzada es InputMismatchException, pero la he buscado y simplemente dice que no coincide el "token" leído con el esperado.
Título: Re: Error al leer double de fichero [HELP]
Publicado por: rub'n en 21 Enero 2019, 20:19 PM
Cita de: JonaLamper en 21 Enero 2019, 19:56 PM
Buenas tardes!

A ver... tengo un código muy fácil que no sé por qué demonios no funciona  :xD Estoy tratando de leer un double desde fichero así:

Código (java) [Seleccionar]
@Override
public double readDouble(Scanner in) {
return in.nextDouble();
}

double element = readDouble(in);


Y en el fichero tengo el siguiente número escrito: 48.46372902270499. Si asigno ese número directamente a la variable element, entonces sí lo procesa, o sea que debe haber algún tipo de fallo en la lectura, pero no sé cuál  :-\  El Scanner in está simplemente declarado así:

Código (java) [Seleccionar]
Scanner in;

Somebody help me :(

P.D: la excepción lanzada es InputMismatchException, pero la he buscado y simplemente dice que no coincide el "token" leído con el esperado.

wtf pon mas source dog, pare ver que pasa.
Título: Re: Error al leer double de fichero [HELP]
Publicado por: Eleкtro en 21 Enero 2019, 21:50 PM
Aparenta ser un simple problema de caracter delimitador...


Saludos
Título: Re: Error al leer double de fichero [HELP]
Publicado por: JonaLamper en 21 Enero 2019, 23:43 PM
Código (java) [Seleccionar]

public double readDouble(Scanner in) {
return in.nextDouble();
}

in.useDelimiter("\n")
double elem = readDouble(in);;


Estoy usando el delimitador "\n" y he puesto los datos en forma de columna en el .txt. Aún así, continúa dando el mismo error  :(
Título: Re: Error al leer double de fichero [HELP]
Publicado por: JonaLamper en 21 Enero 2019, 23:49 PM
Mi fichero tiene estos datos:

48.46372902270499,72.28360046911516
65.52885493079854,22.676786207855894

Incluso usando el código del ejemplo no funciona:

Código (java) [Seleccionar]

in.useDelimiter(",|\n");
double elem = in.nextDouble();
System.out.println(elem);



Incluso en ejemplo de páginas "fiables" no funciona. Por ejemplo: http://www.java2s.com/Code/Java/Development-Class/UseScannertoreadvarioustypesofdatafromafile.htm

He copiado el código de esa página en un proyecto y cuando va a leer el número 12.2, se supone que debe entrar en el if del src.hasNextDouble, pero no, lo lee como si fuese un String. Menuda broma...

ACTUALIZO: haciendo esto funciona, pero no es muy elegante...

Código (java) [Seleccionar]
in.useDelimiter(" ");
String elem = in.next();
double doubleElem = Double.parseDouble(elem);
System.out.println(doubleElem);




Título: Re: Error al leer double de fichero [HELP]
Publicado por: WHK en 22 Enero 2019, 00:43 AM
Te recomiendo que proceces linea por linea y parsees la data con expresión regular, es aprueba de errores, si la expresión falla es porque la linea tiene un formato incorrecto.

/(.+?),([\d\.]+)/
Título: Re: Error al leer double de fichero [HELP]
Publicado por: EdePC en 22 Enero 2019, 05:41 AM
Cita de: JonaLamper en 21 Enero 2019, 23:49 PM

Incluso en ejemplo de páginas "fiables" no funciona. Por ejemplo: http://www.java2s.com/Code/Java/Development-Class/UseScannertoreadvarioustypesofdatafromafile.htm

He copiado el código de esa página en un proyecto y cuando va a leer el número 12.2, se supone que debe entrar en el if del src.hasNextDouble, pero no, lo lee como si fuese un String. Menuda broma...

- Sucede que la Localización da formato a los números decimales y moneda, por ejemplo en EEUU la coma ( , ) no tiene nada que ver con números decimales (Double), pero el punto ( . ) si. Doy por sentado de que tu Sistema Operativo tiene configurada una localización NO EEUU, por lo que tu Sistema interpreta la coma ( , ) como separador decimal, y no tiene ni idea de lo que hace un punto ( . ) entre dos números enteros :xD.

-- Si utilizas decimales con punto ( . ) debes especificar una Localización US (United States), Revisa la línea 5 y 22 que he agregado:

Código (java) [Seleccionar]
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;
import java.util.Locale;

public class MainClass {
  public static void main(String args[]) throws IOException {

    int i;
    double d;
    boolean b;
    String str;

    FileWriter fout = new FileWriter("test.txt");
    fout.write("Testing Scanner 10 12.2 one true two false");
    fout.close();

    FileReader fin = new FileReader("Test.txt");

    Scanner src = new Scanner(fin);
    src.useLocale(Locale.US);

    while (src.hasNext()) {
      if (src.hasNextInt()) {
        i = src.nextInt();
        System.out.println("int: " + i);
      } else if (src.hasNextDouble()) {
        d = src.nextDouble();
        System.out.println("double: " + d);
      } else if (src.hasNextBoolean()) {
        b = src.nextBoolean();
        System.out.println("boolean: " + b);
      } else {
        str = src.next();
        System.out.println("String: " + str);
      }
    }

    fin.close();
  }
}