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

如何从带几何标识的格式化字符串中提取double类型数值

问题排查

你原来的代码出错是因为正则[^0-9]会匹配所有非阿拉伯数字的字符,小数点.也会被一并移除,最终得到的字符串没有小数点,自然无法转换为正确的浮点数。

通用解决方案(兼容单值/多值场景)

直接用正则匹配所有符合浮点格式的数值片段即可,无需提前区分是哪种图形的输入:

  • 定义浮点数匹配正则:[-+]?\\d*\\.?\\d+,可覆盖正负数、整数、带小数点的浮点数场景
  • 用Pattern和Matcher遍历所有匹配结果,逐个转换为double类型存入集合

完整可运行代码示例:

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class NumberExtractor {
    public static void main(String[] args) {
        // 测试三种场景
        String circleInput = "!Circle(1.234)";
        String rectInput = "!Rectangle(1.2,1.3)";
        String triangleInput = "!Triangle(1.1,1.2,1.3)";

        System.out.println(extractDoubles(circleInput)); // 输出 [1.234]
        System.out.println(extractDoubles(rectInput)); // 输出 [1.2, 1.3]
        System.out.println(extractDoubles(triangleInput)); // 输出 [1.1, 1.2, 1.3]
    }

    private static List<Double> extractDoubles(String input) {
        List<Double> numList = new ArrayList<>();
        Pattern pattern = Pattern.compile("[-+]?\\d*\\.?\\d+");
        Matcher matcher = pattern.matcher(input);
        while (matcher.find()) {
            numList.add(Double.parseDouble(matcher.group()));
        }
        return numList;
    }
}

如果是单值场景,直接取返回集合的第一个元素即可:
double circleValue = extractDoubles(circleInput).get(0);

固定格式优化方案

如果你的输入100%是!图形名(参数1,参数2...)的固定格式,也可以先提取括号内内容再拆分处理,性能更高:

private static List<Double> extractDoublesFromFixedFormat(String input) {
    List<Double> numList = new ArrayList<>();
    // 提取括号内的所有内容
    String params = input.replaceAll(".*\\((.*?)\\).*", "$1");
    // 按逗号拆分后逐个转double
    for (String param : params.split(",")) {
        numList.add(Double.parseDouble(param.trim()));
    }
    return numList;
}

内容的提问来源于stack exchange,提问作者Tamamo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:15:04