Last active
October 11, 2018 11:12
-
-
Save pedrojoya/6f3d27cdfe456b4c5a62913a5ed59293 to your computer and use it in GitHub Desktop.
Scanner
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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