2012-02-21 82 views
2

我想知道如何从一个字符串中解析几个双精度数字,但字符串可以混合使用,例如:String s = "text 3.454 sometext5.567568more_text"。 (Double.parseDouble)不适用。我试图用isDigit方法解析它,但是如何解析其他字符和.从一个字符串解析多个双精度

谢谢。

回答

2

与合适的正则表达式就像这个代码或其他职位解析您的双打后,迭代,以匹配那些添加到列表中。这里你有myDoubles准备好在代码的其他地方使用。

public static void main (String args[]) 
{ 
    String input = "text 3.454 sometext5.567568more_text"; 
    ArrayList <Double> myDoubles = new ArrayList <Double>(); 
    Matcher matcher = Pattern.compile("[-+]?\\d*\\.?\\d+([eE][-+]?\\d+)?").matcher(input); 

    while (matcher.find()) 
    { 
     double element = Double.parseDouble(matcher.group()); 
     myDoubles.add(element); 
    } 

    for (double element: myDoubles) 
     System.out.println(element); 
} 
+0

我认为这正是我想要的! – Helgus 2012-02-21 17:22:21

+0

它不能正确解析双打。例如,如果我有一个字符串像“sdf9.99e.23”它解析9.99或当我修改它,它给了9.99e23,但!它应该抛出一些异常或返回false,它不应该在这种情况下返回double值 – Helgus 2012-02-28 14:16:01

+0

,因为9.99e是双倍的,因为您知道“e”用于双打的科学记数法,如果您不想分析他们从代码中的正则表达式中删除[eE]。 – Juvanis 2012-02-28 14:40:00

7

你可以搜索following regex

Pattern.compile("[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?") 

,然后在每场比赛使用Double.parseDouble()

+0

你也可以使用'\\ d'而不是[0-9] – 2012-02-21 16:53:53

+0

如果你选择使用正则表达式,这里有另一个好的链接:http://www.regular-expressions.info/floatingpoint.html – paulsm4 2012-02-21 17:01:06

+0

正则表达式是如果您可以节省几个cpu时钟周期,那就走。 – vinnybad 2012-02-21 18:43:56

1
  1. 解析出的子(用空格包围)

  2. 使用String.ParseDouble()得到的数值

这里有一个例子,使用 “分裂()” 到解析(有很多选择):

// http://pages.cs.wisc.edu/~hasti/cs302/examples/Parsing/parseString.html 

String phrase = "the music made it hard  to  concentrate"; 
String delims = "[ ]+"; 
String[] tokens = phrase.split(delims); 

这是第二种替代方案:

Java: how to parse double from regex

0

你需要好好想想你要用来做什么样的算法的,因为它不是完全明显。如果子字符串是asdf.1asdf,那么应该将其解析为十进制值0.1还是简单地1

此外,一些嵌入的数字可以为负数?如果不是这会大大简化搜索空间。

我认为AIX是在正确的轨道与使用正则表达式的,因为一旦你拿出一个算法这听起来像样的工作状态机(扫描通过输入直到找到一个数字或可选-.,然后查找下一个“非法”字符并正常解析子字符串)。

虽然您不得不考虑边缘情况 - 例如,如果没有负数,您可以使用差不多使用s.split("[^0-9.]")并过滤掉非空元素。但是,不包含数字的句点字符会帮助您。无论您采用哪种解决方案,都要考虑是否有任何情况可能导致问题出现。