如何在特定关键字之后将字符串转换为双精度?
Posted
技术标签:
【中文标题】如何在特定关键字之后将字符串转换为双精度?【英文标题】:How can I convert a string into a double after a specific key word? 【发布时间】:2021-12-20 22:29:42 【问题描述】:我想创建一个方法,将字符串值转换为 在 特定字符串之后的双精度值。
例如:String text1 = "--generalus! -maximus? --petrus 23 --param 123.456";
我在param 出现param 之后搜索值。如果没有param-word,我必须返回一个Double.NaN
。
我试图将字符串拆分为一个数组以使用索引,但parseDouble
-方法不起作用......
你能帮帮我吗?
public double parseParam(String text)
String[] arr = text.split("\\s");
String param = "param";
for (int i = 0; i < arr.length;i++)
System.out.println(arr[i]); //just for me to show whats going on
if(arr[i].equals(param))
return Double.parseDouble(arr[i+1]);
return Double.NaN;
【问题讨论】:
您的尝试失败的原因是您测试的是"param"
而不是"--param"
。但是有更好的方法来解决这个问题;查看答案。
【参考方案1】:
您可以使用正则表达式。查找--param
,后跟一个或多个空格,然后是一个浮点值。将该值分组。然后解析它(如果找到的话)。喜欢,
String text1 = "--generalus! -maximus? --petrus 23 --param 123.456";
Pattern p = Pattern.compile("--param\\s+([+-]?\\d*([.]?\\d+))");
Matcher m = p.matcher(text1);
double val = Double.NaN;
if (m.find())
val = Double.parseDouble(m.group(1));
System.out.println(val);
输出
123.456
【讨论】:
【参考方案2】:如果您比较“--param”而不是“param”,它将起作用。
【讨论】:
【参考方案3】:可能需要使用Apache Commons CLI
等第三方库解析输入字符串中类似于命令行选项的所有参数,或者可以构建键值对映射并且相关参数可以是通过参数名称从地图中检索:
String text1 = "--generalus! -maximus? --petrus 23 --param 123.456";
Map<String, String> map = Arrays.stream(text1.split("[\\-]+")) // Stream<String>
.filter(s -> s != null && !s.trim().isEmpty()) // remove blanks
.map(pair -> pair.split("\\s+")) // Stream<String[]> pairs
.collect(Collectors.toMap(
p -> p[0],
p -> p.length > 1 ? p[1] : ""
));
System.out.println(map);
// available parameter
System.out.println(Double.parseDouble(map.getOrDefault("param", "NaN")));
// missing parameter
System.out.println(Double.parseDouble(map.getOrDefault("param1", "NaN")));
输出:
maximus?=, petrus=23, param=123.456, generalus!=
123.456
NaN
【讨论】:
以上是关于如何在特定关键字之后将字符串转换为双精度?的主要内容,如果未能解决你的问题,请参考以下文章