java – 具有扫描器#nextFloat的奇怪行为
发布时间:2020-12-15 00:05:55 所属栏目:Java 来源:网络整理
导读:在 Eclipse中运行以下操作最初导致Scanner无法识别控制台中的回车,有效地阻止了进一步的输入: price = sc.nextFloat(); 在代码之前添加此行使扫描程序接受0,23(法语符号)作为浮点数: Locale.setDefault(Locale.US); 这很可能是由于Windows XP Pro(法语/比
|
在
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();
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
