Java中如何接收以点作为小数点的double类型输入?
解决Java Scanner接收点作为小数点的问题
这问题我之前帮好几个开发者踩过坑!核心原因其实是**Locale(区域设置)**在搞怪:Scanner默认会用当前JVM的系统Locale来解析数字,如果你的系统Locale是用逗号做小数点的(比如欧洲、南美不少地区的默认设置),那输入.的时候就会触发InputMismatchException。
给你几个靠谱的解决方案,按需选就行:
1. 给Scanner单独指定Locale(最推荐)
直接在创建Scanner时强制它使用以点为小数点的Locale(比如英语区域),不影响全局设置,针对性解决问题:
import java.util.Locale; import java.util.Scanner; public class Main { public static void main(String[] args) { // 指定Locale为美国英语,强制用点作为小数点分隔符 Scanner in_num = new Scanner(System.in).useLocale(Locale.US); double num1 = in_num.nextDouble(); System.out.println("解析后的数字:" + num1); } }
Locale.ENGLISH或者Locale.UK也能达到同样效果,选哪个都可以。
2. 全局设置JVM默认Locale
如果你的整个程序都需要用点作为小数点,可以全局修改JVM的默认Locale:
import java.util.Locale; import java.util.Scanner; public class Main { public static void main(String[] args) { // 全局设置JVM默认Locale为英语区域 Locale.setDefault(Locale.US); Scanner in_num = new Scanner(System.in); double num1 = in_num.nextDouble(); System.out.println("解析后的数字:" + num1); } }
注意:这个操作会影响程序中所有依赖Locale的功能(比如日期、货币格式化),如果只是为了解决Scanner的问题,优先选第一种方法。
3. 先读字符串再手动转换(应急方案)
如果不想碰Locale,也可以先把输入当作字符串读入,再用Double.parseDouble()转换——这个方法默认是按点分隔的规则解析的:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in_num = new Scanner(System.in); String numStr = in_num.next(); try { double num1 = Double.parseDouble(numStr); System.out.println("解析后的数字:" + num1); } catch (NumberFormatException e) { System.out.println("输入格式有误,请输入正确的数字"); } } }
不过这个方法需要自己处理格式异常,不如前两种优雅,适合临时应急用。
内容的提问来源于stack exchange,提问作者Alessandro Petric
相关产品推荐
相关产品推荐

