【问题标题】:How to get float value from string如何从字符串中获取浮点值
【发布时间】:2015-11-26 13:45:11
【问题描述】:

我有一个类似的字符串

> 12.4N-m/kg.

从上面的字符串我需要得到一个值12.4

当我使用替换所有函数str.replaceAll("[^.0-9]", "")

当字符串有两个点时,这不起作用。

浮点值的位置可能不同。

【问题讨论】:

  • 请提供更多可能的输入示例。
  • 请记住,单位可能包含一个数字(如 m^2),它可能不应该以浮点数结尾。
  • @chs 需要做什么才能避免像 m^2 这样用于指定 m-square 的情况?
  • 我添加了一个答案,其中包含两个处理 m^2 的建议。

标签: java regex


【解决方案1】:

首先丢弃所有非浮点字符,然后像这样转换为浮点数:

float f = Float.valueOf("> 12.4N-m/kg.".replaceAll("[^\\d.]+|\\.(?!\\d)", ""));
// now f = 12.4

【讨论】:

  • 你能解释一下模式 [^\\d.]+|\\.(?!\\d) 的含义吗?如果可能,您能解释一下识别给定输入模式的过程吗?
  • 当然@Munesh:那个正则表达式:[^\\d.]+|\\.(?!\\d) 意味着它匹配管道| 两侧的2 个子正则表达式之一。 LHS 匹配除 digit 或 perios 之外的任何内容,而 RHS 表示一个句点,即 NOT 后跟一个使用负前瞻的数字。
  • 感谢阿努巴瓦。如果您在答案中添加此解释会很有帮助。
  • 很好的答案:)
【解决方案2】:

假设您的输入总是在数字之前有一个空格,在它之后有一个N

String t = "> 12.4N-m/kg.";
Pattern p = Pattern.compile("^.*\\s(\\d+\\.\\d)N.*$");
Matcher matcher = p.matcher(t);
if (matcher.matches()) {
    System.out.println(Float.valueOf(matcher.group(1)));
}

【讨论】:

    【解决方案3】:

    尝试使用这个:

    Float.valueOf(str.substring(0,4));
    

    【讨论】:

    • 这里我无法预测位置。它可能会有所不同
    【解决方案4】:

    以下代码将假设输入字符串始终以 "> " 开头并且具有适当的浮点前缀。

    int i=2;
    while(Character.isDigit(str.charAt(i)) || str.charAt(i) == '.') 
        i++;
    float answer = Float.valueOf(str.substring(2,i));
    

    【讨论】:

    • 当数字后面紧跟一个点时仍然不起作用。
    【解决方案5】:

    尝试使用这个正则表达式

    ^[-+]?[0-9]*\.?[0-9]+$
    

    【讨论】:

      【解决方案6】:

      我认为前面的答案遗漏了两点:

      • 还有比这更复杂的数字。
      • 单位中可能有一个数字最终不会出现在浮点数中。

      由于第二点,我认为替换所有非数字的东西不是一个好主意。人们应该搜索字符串中的第一个数字:

      Matcher m = p.matcher(str);
      System.out.println("Input: "+ str);
      if (m.find()) {
          System.out.println("Found: "+ m.group());
          try {
              System.out.println("Number: "+ Float.parseFloat(m.group()));
          } catch (Exception exc) {
              exc.printStackTrace();
          }
      }
      

      或者,你可以做类似的事情

      int i, j;
      for (i = 0; i < str.length(); ++i) {
          if (mightBePartOfNumber(str.charAt(i))) {
              break;  
          }       
      }       
      for (j = i; j < str.length(); ++j) {
          if (!mightBePartOfNumber(str.charAt(j))) {
              break;  
          }       
      }       
      String substr = str.substring(i, j);
      System.out.println("Found: "+ substr);
      try {   
          System.out.println("Number: "+ Float.parseFloat(substr));
      } catch (Exception exc) {
          exc.printStackTrace();
      }       
      

      有一个助手

      private static boolean mightBePartOfNumber(char c) {
          return ('0' <= c && c <= '9') || c == '+' || c == '-' || c == '.' || c == 'e' || c == 'E'; 
      }       
      

      【讨论】:

        【解决方案7】:

        我已经尝试了上述选项,但对我不起作用,请尝试以下模式

        Pattern pattern = Pattern.compile("\\d+(?:\\.\\d+)?");
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-03
          • 1970-01-01
          相关资源
          最近更新 更多