Skip to content

Instantly share code, notes, and snippets.

@pedrojoya
Last active October 11, 2018 11:12
Show Gist options
  • Save pedrojoya/6f3d27cdfe456b4c5a62913a5ed59293 to your computer and use it in GitHub Desktop.
Save pedrojoya/6f3d27cdfe456b4c5a62913a5ed59293 to your computer and use it in GitHub Desktop.
Scanner
import java.util.Locale;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int age;
String name;
String level;
double grade;
/*
El problema del nextLine() después de nextInt() se puede solucionar simplemente
usando next() en vez de nextLine(). Sin embargo entonces aparece el problema de que
no podríamos introducir el nombre completo del alumno con apellidos, ya que next()
almacenaría en la variable sólo el primer token (la primera palabra, que
corresonde al nombre), dejando el resto de tokens (los apellidos) en el buffer.
Pero existe una solución a esto. Podemos indicarle al objeto scanner que como
delimitador sólo use el \n. De esta forma, cuando hagamos next(), el siguiente token
será el nombre completo incluyendo apellidos (todos los caracteres hasta el
siguiente \n).
El único inconveniente de esto es que lo hace incompatible que leer palabra a palabra,
pero la verdad eso no es muy habitual, por lo que si no es nuestro caso, parece
más útil definir \n como delimitador y usar next() para leer la siguiente línea
en vez de nextLine().
*/
// Los métodos useLocale y useDelimiter retornan el propio objeto Scanner, para poder
// usar la famosa fluent syntax.
Scanner keyboard = new Scanner(System.in).useLocale(Locale.US).useDelimiter("\\n");
System.out.println("Edad: ");
age = keyboard.nextInt();
System.out.println("Nombre (incluyendo apellidos): ");
// Aunque usamos next(), en realidad se va a procesar hasta el siguiente \n, porque
// así hemos configurado el delimitador de tokens.
name = keyboard.next();
System.out.println("Ciclo: ");
level = keyboard.next();
System.out.println("Nota (con decimales): ");
// Gracias a useLocale(Locale.US) el símbolo seperador de decimales será el .
// Sinceramente no sé si merece la pena.
grade = keyboard.nextDouble();
// La conversión de grade a cadena para ser concatenado NO tiene en cuenta el Locale
// del sistema operativo.
System.out.println(name + " (" + age + ") - " + level + ": " + grade);
// Curiosamente si no se especifica nada printf usa el Locale por defecto del sistema.
System.out.printf("%s (%d) - %s: %.1f\n", name, age, level, grade);
// Aunque podemos especificar como primer parámetro un Locale distinto.
System.out.printf(Locale.US, "%s (%d) - %s: %.1f\n", name, age, level, grade);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment