【问题标题】:Get Double from string in Java从Java中的字符串获取Double
【发布时间】:2012-06-10 18:07:38
【问题描述】:

我有一个文本(字符串),我只需要从中获取数字,我的意思是如果我有文本:

“我在 53.2 公里外”,我想得到“53.2”(不是 532 或 53 或 2)

我尝试了Extract digits from a string in Java 中的解决方案。它返回“532”。

有人对此有想法吗?

感谢

【问题讨论】:

    标签: java string parsing


    【解决方案1】:

    您可以直接使用Scanner,它具有nextDouble()hasNextDouble() 方法如下:

            Scanner st = new Scanner("I'm 53.2 km away");
            while (!st.hasNextDouble())
            {
                st.next();
            }
            double value = st.nextDouble();
            System.out.println(value);
    

    输出:53.2

    【讨论】:

      【解决方案2】:

      这是带有测试仪的好正则表达式站点:

      http://gskinner.com/RegExr/

      这很好用\d+\.?\d+

      【讨论】:

        【解决方案3】:
        import java.util.regex.*;
        
        class ExtractNumber
        {
            public static void main(String[] args)
            {
                String str = "I'm 53.2 km away";
                String[] s = str.split(" ");
                Pattern p = Pattern.compile("(\\d)+\\.(\\d)+");
                double d;
                for(int i = 0; i< s.length; i++)
                {
                    Matcher m = p.matcher(s[i]);
                    if(m.find())
                        d = Double.parseDouble(m.group());
                }
                System.out.println(d);
            }
        }
        

        【讨论】:

        • 请注意,这也将匹配整个 53.2km,即它不会剥离 km。该示例确实使用了一个空格,但这只是一个 nit。
        • @pb2q: 将s[i] 替换为m.group() 这应该可以解决您指出的问题。
        【解决方案4】:

        最好和最简单的方法是使用正则表达式和 replaceAll 字符串方法。例如

        String a = "2.56 Kms";
        
        String b = a.replaceAll("\\^[0-9]+(\\.[0-9]{1,4})?$","");
        
        Double c = Double.valueOf(b);
        
        System.out.println(c);
        

        【讨论】:

          【解决方案5】:

          如果您确定您的数字是“单词”(空格分隔)并且不想使用正则表达式,则可以解析它们...

          String myString = "I'm 53.2 km away";
          List<Double> doubles = new ArrayList<Double>();
          for (String s : myString.split(" ")) {
              try {
                  doubles.add(Double.valueOf(s));
              } catch (NumberFormatException e) {
              }
          }
          

          【讨论】:

          • 并创建大量无用的异常对象?
          • @dantuch 它们并不是没用的:它们表示String 无法解析。
          • @Jeffrey 不!它们不应该首先被创建。你知道“异常驱动开发”代表什么吗?只是不要在非异常情况下使用异常。将I'm 解析为以失败结尾的双重结尾一点也不例外。
          • @dantuch 但是异常仍然不是没用,它们正在执行一项任务。然而,它们是不必要的。
          【解决方案6】:

          我刚刚做了一个方法getDoubleFromString。我认为这不是最好的解决方案,但效果很好!

          public static double getDoubleFromString(String source) {
                  if (TextUtils.isEmpty(source)) {
                      return 0;
                  }
          
                  String number = "0";
                  int length = source.length();
          
                  boolean cutNumber = false;
                  for (int i = 0; i < length; i++) {
                      char c = source.charAt(i);
                      if (cutNumber) {
                          if (Character.isDigit(c) || c == '.' || c == ',') {
                              c = (c == ',' ? '.' : c);
                              number += c;
                          } else {
                              cutNumber = false;
                              break;
                          }
                      } else {
                          if (Character.isDigit(c)) {
                              cutNumber = true;
                              number += c;
                          }
                      }
                  }
                  return Double.parseDouble(number);
              }
          

          【讨论】:

            猜你喜欢
            • 2017-10-16
            • 1970-01-01
            • 1970-01-01
            • 2013-06-27
            • 1970-01-01
            • 2013-07-09
            • 2012-04-04
            • 1970-01-01
            • 2016-10-01
            相关资源
            最近更新 更多