You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 06:36:16