在Java中从字符串获取双精度

在Java中从字符串获取双精度,java,string,parsing,Java,String,Parsing,我有一个文本(字符串),我只需要从中获取数字,我的意思是如果我有文本: “我在53.2公里之外”,我想得到“53.2”(不是532或53或2) 我试过了这个解决办法。它返回我“532” 有人对此有想法吗 Thanx这里有一个很好的带有测试仪的正则表达式站点: 这工作正常。\d+\?\d+这是一个很好的带有测试仪的正则表达式站点: import java.util.regex.*; class ExtractNumber { public static void main(String

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

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

我试过了这个解决办法。它返回我“532”

有人对此有想法吗


Thanx

这里有一个很好的带有测试仪的正则表达式站点:


这工作正常。
\d+\?\d+

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

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);
    }
}

这可以正常工作
\d+\.?\d+

导入java.util.regex.*;
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);
    }
}
类别编号 { 公共静态void main(字符串[]args) { String str=“我在53.2公里之外”; 字符串[]s=str.split(“”); 模式p=Pattern.compile(“(\\d)+\\.(\\d)+”); 双d; 对于(int i=0;i
导入java.util.regex.*;
类别编号
{
公共静态void main(字符串[]args)
{
String str=“我在53.2公里之外”;
字符串[]s=str.split(“”);
模式p=Pattern.compile(“(\\d)+\\.(\\d)+”);
双d;
对于(int i=0;i
如果您确定您的数字是“单词”(空格分隔),并且不想使用正则表达式,您可以直接解析它们

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) {
    }
}
String myString=“我在53.2公里以外”;
List double=new ArrayList();
用于(字符串s:myString.split(“”){
试一试{
Double.add(Double.valueOf(s));
}捕获(数字格式){
}
}

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

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) {
    }
}
String myString=“我在53.2公里以外”;
List double=new ArrayList();
用于(字符串s:myString.split(“”){
试一试{
Double.add(Double.valueOf(s));
}捕获(数字格式){
}
}
您可以直接使用具有
nextDouble()
hastnextdouble()
方法的,如下所示:

        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

您可以直接使用具有
nextDouble()
hastnextdouble()
方法的,如下所示:

        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

最好且简单的方法是使用正则表达式和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);

最好且简单的方法是使用正则表达式和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);

我刚刚创建了一个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);
    }
公共静态双getDoubleFromString(字符串源){
if(TextUtils.isEmpty(源)){
返回0;
}
字符串编号=“0”;
int length=source.length();
布尔割数=假;
for(int i=0;i
我刚刚创建了一个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);
    }
公共静态双getDoubleFromString(字符串源){
if(TextUtils.isEmpty(源)){
返回0;
}
字符串编号=“0”;
int length=source.length();
布尔割数=假;
for(int i=0;i
并创建大量无用的异常对象?@dantuch它们不是无用的:它们发出的信号是无法解析
字符串
。@Jeffrey不!首先不应该创建它们。你知道“异常驱动开发”代表什么吗?只是不要在非异常的情况下使用异常。解析
I'm
以失败为双结尾一点也不例外。@dantuch但这些异常仍然不是无用的,它们正在执行一项任务。但是,它们是不必要的。并且会创建许多无用的异常对象?@dantuch它们不是无用的:它们发出的信号是,
字符串
无法解析。@Jeffrey不!首先不应该创建它们。你知道“异常驱动开发”代表什么吗?只是不要在非异常的情况下使用异常。解析
I'm
以失败为双结尾一点也不例外。@dantuch但这些异常仍然不是无用的,它们正在执行一项任务。但是,它们是不必要的。请注意,这也将匹配整个53.2km,即不会剥离
km
。该示例确实使用了空格,但这只是一个nit。@pb2q:将
s[i]
替换为
m.group()
这应该可以解决您指出的问题。请注意,这也将匹配整个53.2km,即它不会剥离
km
。该示例确实使用了空格,但这只是一个nit。@pb2q:将
s[i]
替换为