【问题标题】:Parse multiple doubles from a String从字符串中解析多个双精度数
【发布时间】:2012-03-11 23:59:24
【问题描述】:

我想知道如何从一个字符串中解析几个双数,但字符串可以混合,例如:String s = "text 3.454 sometext5.567568more_text"

标准方法 (Double.parseDouble) 不合适。我尝试使用isDigit 方法解析它,但是如何解析其他字符和.

谢谢。

【问题讨论】:

    标签: java string parsing numbers double


    【解决方案1】:

    您可以搜索following regex:

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

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

    【讨论】:

    • 你也可以用\\d代替[0-9]
    • 如果您选择使用正则表达式,这里还有一个很好的链接:regular-expressions.info/floatingpoint.html
    • 如果您可以节省几个 cpu 时钟周期,Regex 是您的最佳选择。
    • 它没有正确解析双打。例如,如果我有一个像“sdf9.99e.23”这样的字符串,它会解析 9.99,或者当我修改它时,它会给出 9.99e23,但是!它应该抛出一些异常或返回 false(或其他东西,但不是双精度值),在这种情况下它不应该返回双精度值
    【解决方案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 );
    }
    

    【讨论】:

    • 我想这正是我想要的!
    • 它没有正确解析双打。例如,如果我有一个像“sdf9.99e.23”这样的字符串,它会解析 9.99,或者当我修改它时,它会给出 9.99e23,但是!它应该抛出一些异常或返回 false,在这种情况下它不应该返回双精度值
    • @Helgus 输入 "sdf9.99e.23" 包含 2 个双精度数:9.99 和 0.23,您将看到它们与正则表达式匹配并将作为输出。我的回答对您的原始问题有效,并且没有指定您现在要说的内容。你应该在另一个问题中问它。顺便说一下,我的答案中的正则表达式是一般的双正则表达式。
    • @Helgus:是的,我明白这一点。但是例如X 在双数中的一个数字之后是无效的,当输入是123X 时,您只需忽略它并说输入包含123。什么是规则让你忽略X而不是e...
    【解决方案3】:
    1. 解析出子串(被空格包围)

    2. 使用String.ParseDouble()获取数值

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

    // 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

    【讨论】:

      【解决方案4】:

      您需要考虑要使用哪种算法,因为这并不完全显而易见。如果子字符串是asdf.1asdf,应该将其解析为十进制值0.1 还是简单的1

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

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

      这是您必须考虑的极端情况 - 例如,如果没有负数,您几乎可以使用 s.split("[^0-9.]") 并过滤掉非空元素。但是,不属于数字的句点字符会吸引您。无论您采用何种解决方案,请考虑是否有任何情况可能导致问题发生。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-21
        • 2010-11-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多