Scanner#nextFloat的怪异行为

在Eclipse中运行以下内容最初会导致Scanner无法识别控制台中的回车,从而有效阻止进一步的输入:

price = sc.nextFloat();

在代码之前添加此行使Scanner接受0,23(法语符号)作为浮点数:

Locale.setDefault(Locale.US);

这很可能是由于Windows XP Pro(法国/比利时)的区域设置。 当代码再次运行时,仍然接受0,23,输入0.23会导致它抛出java.util.InputMismatchException

任何解释为什么会发生这种情况? 也有解决方法,或者我应该只使用Float#parseFloat

编辑:这演示了Scanner如何以不同的语言环境行为(取消注释其中一行)。

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

}

编辑:这再现了扫描仪正在等待浮动值但在按下返回时无法触发的问题:

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

}

我想知道你是否没有适当地处理行结束符。 通常,如果您使用Scanner#next ###()(除了nextLine),并且您在用户按下Enter时到达行标记的结尾,如果您不处理行标记的结束,它将阻止Scanner对象适当地工作。 要解决这个问题,需要处理该令牌时调用Scanner#nextLine()。 如果您发布了一些代码,我们可以看到这是否是您的问题,以及我的建议是否提供了解决方案。

编辑:不,你不使用System.in所以这不是问题。 另一方面,在接受法文号码之前,您确实需要设置扫描仪的语言环境。 即

     sc = new Scanner(frenchDecimal);
     sc.useLocale(Locale.FRENCH);
     price = sc.nextFloat();
链接地址: http://www.djcxy.com/p/96063.html

上一篇: Weird behaviour with Scanner#nextFloat

下一篇: How to use Scanner methods when scanning a String?