Error al leer double de fichero [HELP]

Iniciado por JonaLamper, 21 Enero 2019, 19:56 PM

0 Miembros y 1 Visitante están viendo este tema.

JonaLamper

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.
Utilizar palabras para hablar de palabras es como utilizar un lápiz para hacer un dibujo de ese lápiz sobre el mismo lápiz.

rub'n

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.


rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen

Eleкtro









JonaLamper

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  :(
Utilizar palabras para hablar de palabras es como utilizar un lápiz para hacer un dibujo de ese lápiz sobre el mismo lápiz.

JonaLamper

#4
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);




Utilizar palabras para hablar de palabras es como utilizar un lápiz para hacer un dibujo de ese lápiz sobre el mismo lápiz.

WHK

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\.]+)/

EdePC

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();
  }
}