Foro de elhacker.net

Programación => 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
  1. @Override
  2. public double readDouble(Scanner in) {
  3. return in.nextDouble();
  4. }
  5.  
  6. 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
  1. 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
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
  1. @Override
  2. public double readDouble(Scanner in) {
  3. return in.nextDouble();
  4. }
  5.  
  6. 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
  1. 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...

  • https://stackoverflow.com/a/39989531/1248295

Saludos


Título: Re: Error al leer double de fichero [HELP]
Publicado por: JonaLamper en 21 Enero 2019, 23:43 pm
Código
  1. public double readDouble(Scanner in) {
  2. return in.nextDouble();
  3. }
  4.  
  5. in.useDelimiter("\n")
  6. 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
  1. in.useDelimiter(",|\n");
  2. double elem = in.nextDouble();
  3. 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
  1. in.useDelimiter(" ");
  2. String elem = in.next();
  3. double doubleElem = Double.parseDouble(elem);
  4. 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.

Código:
/(.+?),([\d\.]+)/


Título: Re: Error al leer double de fichero [HELP]
Publicado por: EdePC en 22 Enero 2019, 05:41 am

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
  1. import java.io.FileReader;
  2. import java.io.FileWriter;
  3. import java.io.IOException;
  4. import java.util.Scanner;
  5. import java.util.Locale;
  6.  
  7. public class MainClass {
  8.  public static void main(String args[]) throws IOException {
  9.  
  10.    int i;
  11.    double d;
  12.    boolean b;
  13.    String str;
  14.  
  15.    FileWriter fout = new FileWriter("test.txt");
  16.    fout.write("Testing Scanner 10 12.2 one true two false");
  17.    fout.close();
  18.  
  19.    FileReader fin = new FileReader("Test.txt");
  20.  
  21.    Scanner src = new Scanner(fin);
  22.    src.useLocale(Locale.US);
  23.  
  24.    while (src.hasNext()) {
  25.      if (src.hasNextInt()) {
  26.        i = src.nextInt();
  27.        System.out.println("int: " + i);
  28.      } else if (src.hasNextDouble()) {
  29.        d = src.nextDouble();
  30.        System.out.println("double: " + d);
  31.      } else if (src.hasNextBoolean()) {
  32.        b = src.nextBoolean();
  33.        System.out.println("boolean: " + b);
  34.      } else {
  35.        str = src.next();
  36.        System.out.println("String: " + str);
  37.      }
  38.    }
  39.  
  40.    fin.close();
  41.  }
  42. }