2011-01-16 17 views
11

Ejecutar el siguiente en Eclipse causó inicialmente escáner no reconocer retornos de carro en la consola de bloqueo efectiva entrada adicional:comportamiento extraño con escáner # nextFloat

price = sc.nextFloat(); 

La adición de esta línea antes hace que el escáner de código de aceptar 0,23 (notación francés) como un float:

Locale.setDefault(Locale.US); 

Esto es muy probablemente debido a la configuración regional de Windows XP Pro (francés/belga). Cuando se ejecuta nuevamente el código, 0,23 se sigue aceptando e ingresando 0,23 hace que arroje un java.util.InputMismatchException.

¿Alguna explicación de por qué esto está sucediendo? ¿También hay una solución alternativa o debería simplemente usar Float#parseFloat?

Editar: Esto demuestra cómo el escáner se comporta con diferentes configuraciones regionales (descomenta una de las líneas al principio).

import java.util.Locale; 
import java.util.Scanner; 


public class NexFloatTest { 

    public static void main(String[] args) { 

     //Locale.setDefault(Locale.US); 
     //Locale.setDefault(Locale.FRANCE); 

     // Gives fr_BE on this system 
     System.out.println(Locale.getDefault()); 

     float price; 

     String uSDecimal = "0.23"; 
     String frenchDecimal = "0,23"; 

     Scanner sc = new Scanner(uSDecimal); 

     try{ 
      price = sc.nextFloat(); 
      System.out.println(price); 
     } catch (java.util.InputMismatchException e){ 
      e.printStackTrace(); 
     } 

     try{ 
      sc = new Scanner(frenchDecimal); 
      price = sc.nextFloat(); 
      System.out.println(price); 
     } catch (java.util.InputMismatchException e){ 
      e.printStackTrace(); 
     } 

     System.out.println("Switching Scanner to System.in"); 

     try{ 
      sc = new Scanner(System.in); 
      System.out.println("Enter a float value"); 
      price = sc.nextFloat(); 
      System.out.println(price); 
     } catch (java.util.InputMismatchException e){ 
      e.printStackTrace(); 
     } 

     System.out.print("Enter title:"); 

     String title = sc.nextLine(); // This line is skipped 

     System.out.print(title); 
    } 

} 

Editar: Esta reproduce el problema por el que el escáner está esperando a un valor de coma flotante, pero no consigue activar al pulsar retorno:

import java.util.Scanner; 

public class IgnoreCRTest { 

    public static void main(String[] args) { 
     Scanner sc = new Scanner(System.in); 
     System.out.println("Enter a float value:"); 
     // On french Locale use , as the decimal separator 
     float testFloat = sc.nextFloat(); 
     System.out.println(testFloat); 
     //sc.skip("\n"); // This doesn't solve the issue 
     sc.nextLine(); 
     System.out.println("Enter an integer value:"); 
     int testInt = sc.nextInt(); 
     System.out.println(testInt); 
     // Will either block or skip here 
     System.out.println("Enter a string value :"); 
     String testString = sc.nextLine(); 
     System.out.println(testString); 
    } 

} 
+3

¿Puede dar un ejemplo ejecutable que muestre la secuencia real del código que está ejecutando y que manifieste el problema? –

+0

Sure. Añadiré un código en unos minutos. –

Respuesta

13

Me pregunto si no está manejando un final de línea token apropiadamente. A menudo si usa Scanner # next ###() (excepto nextLine), y llega a un token de final de línea como cuando el usuario presiona enter, si no maneja el token de final de línea, evitará que el Scanner Objeto de trabajar apropiadamente. Para resolver esto, llame a Scanner # nextLine() cuando este token necesite ser manejado. Si publica algo de su código, podemos ver si este es realmente su problema y si mi sugerencia ofrece una solución.

editar: no, no estás usando System.in, así que este no es el problema. Por otro lado, debe establecer la configuración regional del Escáner antes de aceptar el número francés. es decir,

 sc = new Scanner(frenchDecimal); 
    sc.useLocale(Locale.FRENCH); 
    price = sc.nextFloat(); 
+3

si no llama a useLocale (...) el escáner se construirá con la Configuración regional predeterminada. La configuración regional predeterminada del OP es francesa. –

+1

Gracias por la respuesta, pero lo siento, de alguna manera me perdí eso. ¿Dónde dice que la configuración regional predeterminada es francés? –

+0

Gracias. Establecer la configuración regional para el escáner hace el truco (yo quería usar el decimal de EE. UU.). ¿Alguna idea sobre qué está causando que la línea siguiente se omita en el código modificado? Además, desde que se configuró la configuración regional, no he podido reproducir el problema donde el escáner parece estar aceptando texto, pero no reconoce los retornos de carro. –