如何从带几何标识的格式化字符串中提取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
相关产品推荐
相关产品推荐

