微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 具有扫描器#nextFloat的奇怪行为

Eclipse中运行以下操作最初导致Scanner无法识别控制台中的回车,有效地阻止了进一步的输入:
price = sc.nextFloat();

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

Locale.setDefault(Locale.US);

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

任何解释为什么会发生这种情况?还有一个解决方法,还是应该使用Float#parseFloat?

编辑:这演示了扫描仪的行为与不同的区域设置(取消注释开头的行之一).

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

}

解决方法

我不知道你是否没有适当地处理线路令牌的结束.如果您使用扫描仪#下一个###()(nextLine除外),通常会像用户按Enter键一样达到行结束符号,如果不处理行标记的结尾,则会阻止扫描仪对象从工作适当.要解决此问题,请在需要处理此令牌时调用扫描器#nextLine().如果你发布你的一些代码,我们可以看到这是否真的是你的问题,如果我的建议提供了一个解决方案.

编辑:不,你没有使用system.in,所以这不是问题.另一方面,您需要在接受法国号码之前设置扫描仪的区域设置.即,

sc = new Scanner(frenchDecimal);
     sc.useLocale(Locale.french);
     price = sc.nextFloat();

原文地址:https://www.jb51.cc/java/126747.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐