【问题标题】: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"。但是有更好的方法来解决这个问题;查看答案。

标签: java arrays string parsing double


【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-16
        • 1970-01-01
        • 2011-08-11
        • 1970-01-01
        相关资源
        最近更新 更多