Komisches Verhalten mit Scanner#nextFloat

Ausführen der Folgendes in Eclipse zunächst verursacht Scanner nicht erkennen, Wagenrücklauf in der Konsole effektiv blockiert weitere Eingaben:

price = sc.nextFloat();

Fügen Sie diese Zeile vor dem code bewirkt, dass der Scanner zu akzeptieren 0,23 (französische Schreibweise) als float:

Locale.setDefault(Locale.US);

Dies ist wahrscheinlich aufgrund des regionalen Einstellungen in Windows XP Pro (Französisch/Belgisch). Wenn der code erneut ausgeführt 0,23 wird noch immer akzeptiert und die Eingabe 0.23 bewirkt, dass es zu werfen java.util.InputMismatchException.

Jede Erklärung, warum dies passiert ist? Auch gibt es einen workaround oder sollte ich einfach verwenden Float#parseFloat?

Edit: Das zeigt, wie sich der Scanner verhält sich mit verschiedenen Gebietsschemata (kommentieren Sie die Zeilen am Anfang).

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

}

Edit: Diese reproduziert das Problem, wo der Scanner wartet auf einen float-Wert, kann Sie aber nicht auslösen, wenn Sie drücken Sie die EINGABETASTE:

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

}
Können Sie ein ausführbares Beispiel, welches den tatsächlichen sequece code du läufst und manifestiert sich das problem?
Sicher. Ich ' ll fügen Sie einige code, der in ein paar Minuten Zeit.

InformationsquelleAutor James P. | 2011-01-16

Schreibe einen Kommentar