Java如何从含非数字的字符串中提取double值 解决NumberFormatException
异常原因
Double.parseDouble() 仅支持解析完全由合法浮点数格式组成的字符串,传入包含非数字字符(比如示例里的空格、hello文本)的整行内容时,就会抛出java.lang.NumberFormatException。
问题代码片段:
while(scanner.hasNextLine()) { String ReadString = scanner.nextLine(); double value = Double.parseDouble(ReadString); }
对应异常栈信息:
Exception in thread "main" java.lang.NumberFormatException: For input string: "65.2 hello" at java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2054) at java.base/jdk.internal.math.FloatingDecimal.parseDouble(FloatingDecimal.java:110) at java.base/java.lang.Double.parseDouble(Double.java:549) at com.company.Main.main(Main.java:18)
可行实现方案
- 正则匹配提取方案(适配性最强,支持从字符串任意位置提取数值,也支持提取一行内的多个数值)
用正则匹配字符串中符合浮点数规则的子串,提取到纯数字子串后再做类型转换,参考代码:import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 正则规则:匹配可选负号、整数段、可选小数段的浮点数 Pattern numPattern = Pattern.compile("-?\\d+(\\.\\d+)?"); while (scanner.hasNextLine()) { String line = scanner.nextLine(); Matcher matcher = numPattern.matcher(line); while (matcher.find()) { double value = Double.parseDouble(matcher.group()); // 此处编写拿到value后的业务逻辑 System.out.println("提取到数值:" + value); } } } } - 字符串切割方案(仅适配数值在行首、和后续文本用空白分隔的固定格式场景)
如果输入格式固定为「数值+空格+其他文本」,可以直接切割字符串取数字段做解析:while(scanner.hasNextLine()) { String line = scanner.nextLine().trim(); String numPart = line.split("\\s+")[0]; double value = Double.parseDouble(numPart); } - Scanner原生读取方案
Scanner本身自带按分隔符读取double的能力,会自动跳过非数值的分隔内容,不需要手动解析整行:while (scanner.hasNextDouble()) { double value = scanner.nextDouble(); // 拿到数值后如果需要消费掉本行剩余内容,可执行scanner.nextLine() }
注意:如果输入的数值可能包含科学计数法、正号前缀等特殊格式,调整对应正则匹配规则即可。
内容的提问来源于stack exchange,提问作者Kristina
相关产品推荐
相关产品推荐

