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í:
@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í:
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.
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í:
@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í:
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.
Aparenta ser un simple problema de caracter delimitador...
- https://stackoverflow.com/a/39989531/1248295
Saludos
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 :(
Mi fichero tiene estos datos:
48.46372902270499,72.28360046911516
65.52885493079854,22.676786207855894
Incluso usando el código del ejemplo no funciona:
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...
in.useDelimiter(" ");
String elem = in.next();
double doubleElem = Double.parseDouble(elem);
System.out.println(doubleElem);
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\.]+)/
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:
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();
}
}